programing

포인터가 자신을 가리킬 수 있습니까?

i4 2023. 6. 20. 21:22
반응형

포인터가 자신을 가리킬 수 있습니까?

질문은 만약 포인터 변수가 값과 같은 주소를 가지고 있다면, 그것은 정말로 자신을 가리키는 것입니까?

들어 - 에서 는 " 들어코 - 에조서각드다음예"입니다.a그 자체에 대한 포인터?

#include<stdio.h>

int main(){
   int* a;
   int b = (int)&a;
   a = b;
   printf("address of a = %d\n", &a);
   printf("  value of a = %d\n", a);
}

한다면a자체에 대한 포인터가 아닌 경우 동일한 질문이 다시 제기됩니다.포인터가 자신을 가리킬 수 있습니까?
또한, 셀프 포인팅 포인터는 어떻게 유용합니까?

void* p = &p;

크게 유용하지는 않지만 자신을 가리키는 구조체는 길이 1의 순환 목록에서 유용합니다.

typedef struct A {
  struct A* next;
} A;

A a = { &a };

당신의 정확한 예에 따르면, 당신이 말한 것은 다음과 같습니다.

int* a;
int b = (int)&a;
a = (int*)b;

// which can be simplified to:
int* a = (int*)&a;

여러분이 실제로 하고 있는 것은 스스로를 가리키는 포인터가 없는 입니다.포인터에 할당된 메모리 공간을 사용하여 포인터의 위치를 저장하고 있습니다.int에 대한 포인터는 int를 가리킵니다. 자신을 포함한 int에 대한 다른 포인터는 절대 가리키지 않습니다.

를 들어, " 예들포를터만고가보다니겠습정해다든를인어▁pointer▁a"를 가정해 a:

int * a;

그것은 기억 속에 자리를 잡습니다.

   4     a (5)    6
[....][00000000][....]

이 간단한 예에서 a가 메모리 위치 '5'에 있다고 가정합니다.

이 작업을 수행할 경우:

a = (int*)&a;

...다음과 같은 일이 발생할 수 있습니다.

   4     a (5)    6
[....][00000005][....]

여기서 일어나는 일은a 55의 있습니다. 는 위치 5의 정수입니다.이것은 또한 같은 메모리 위치에서 발생합니다.&a가리키는 것이지만, 무엇의 맥락에서.a를 가리키고 위치 5에 를 가리키고 , 는 5185 를 가 키 고 에 있 5리 입 고 5이입니다.

예를 들어, 두 가지 모두 작동합니다.

cout<<(int)a;//outputs 5
cout<<*a;//Outputs the integer at memory location 5 - which is 5.

에 대한 포인터를 만들려면 다음 방법 중 하나를 사용할 수 있습니다.

int **b = (int**)a;

또는

int ** b = &a;



그것을 합니다.a그 자체에 대한 포인터가 아닙니다.이것은 저장된 위치의 정수에 대한 포인터로, 우연히 자신의 위치와 동일합니다.


(더 간단한 예를 통해) 무슨 일이 일어나고 있는지 더 자세히 보여주기 위해, 유사한 일이 발생할 수 있습니다.int 즉, 를 저 장 있 수 습 니 다 할int그 자체로:

int a=999;

a이제 메모리에 위치가 있고 값은 999입니다(메모리 위치 '46'에 배치된 것으로 가정합니다).

  45     a (46)   47
[....][00000999][....]

. - 이 숫자를 '46' 위치있다 내에 할 수 . 원한다면 이 숫자를 정수로 저장할 수 있습니다.a:

a=(int)&a;

  45     a (46)   47
[....][00000046][....]

그리고 지금은a 와같과 .&a가치는 있지만 유형은 아닙니다.a그것은 단지 정수일 뿐이며, 우리가 그것을 자신의 메모리 위치를 저장하기 위해 사용했다고 해서 마법처럼 자신을 가리키는 것은 아닙니다.

음, 우선 코드를 바꾸겠습니다.

int **a;
a = (int **)&a;  // otherwise you get a warning, since &a is int ***

당신이 왜 이런 짓을 하는지는 모르겠지만, 그건 허용됩니다.

printf("The address of a is %p\n", &a);
printf("a holds the address %p\n", a);
printf("The value at %p is %p\n", a, *a); // the *a is why we made a an int **

그들은 같은 것을 출력해야 합니다.

The address of a is 0x7fffe211d078
a holds the address 0x7fffe211d078
The value at 0x7fffe211d078 is 0x7fffe211d078

이것은 좋은 생각이 아닙니다. 바로 그 첫 출연자들이a = (int **)&a강요하는 것은 해킹입니다.a그것이 가져서는 안 될 가치를 가지고 있습니다.당신은 그것을 선언합니다.int **라도 해보세요.int ***그 안에.기술적으로 크기는 같지만 일반적으로 사람들이 기대하기 때문에 그렇게 하지 마세요.int *는 할 수 있는 를 보유하고 있습니다.int얼마 안 될 것

예와 아니오, 포인터의 유형은 포인터의 값만큼 중요하기 때문입니다.

예, 포인터는 자신에 대한 포인터의 위치를 포함할 수 있습니다. 길이가 길어도 자신에 대한 포인터의 위치를 포함할 수 있습니다.(Int는 보통 할 수 있지만, 그것이 모든 곳에서 보장되는지는 모르겠습니다.)

그러나 이 관계를 나타내는 유형은 없습니다.자신을 가리키는 포인터가 있으면 참조를 취소할 때 실제로는 다른 유형이 있습니다.그래서:

void *p = &p;
// *p is illegal, even though you probably wanted it to equal 'p'
if( *p != p ) {
    printf("Something's wrong");
}

int *i = (int*)&i;
// The following statement is still illegal
if( *i == i ) {
    printf("The universe works!");
}

저는 대답이 '아니오'라고 말할 것입니다. 왜냐하면 여러분이 활자 시스템을 남용하지 않는다면 작동하지 않을 것이기 때문입니다.저는 그것이 당신이 뭔가 잘못하고 있다는 것을 보여주는 것이라고 생각합니다(때로는 확실히 필요하지만).

포인터를 참조 해제하면 해당 유형의 값이 됩니다(예: 참조 해제).int*를 제공합니다.int하나의int*s 값 유형).의 값 이 "" " " " " " " "이어야 .int*그것은 사실이 아닙니다.int*가 자기 는 컴파일러에 입니다.따라서 포인터가 자신을 가리키기 위해서는 컴파일러가 포인터를 얻기 위해 일종의 캐스트를 수행해야 합니다.

int* a;
a = reinterpret_cast<int*>(&a);

a그러면, 당신은 가질 것입니다.int그의 가치는 우연히 발생하는 주소입니다.a 잘라냄) , 위유치(이형맞주잘라냄를)입니다.int 혀가 int*다른 깁스가 필요할 겁니다

포인터에 대한 포인터는 종종 핸들로 알려져 있는데, 이것은 다른 유형입니다.int**보다 ( ) 더 많이 사용합니다.int* (로 a). (으):int**값은 " " " " 입니다.int*.)

예, 답변에 언급된 대로 포인터가 자신을 가리킬 수 있습니다.

가능한 사용 사례는 NULL 포인터 대신 이 트릭을 사용할 수 있습니다.int * p = (int * )&p를 초기화하고 나중에 이를 확인하여 포인터가 유효한지 여부를 확인할 수 있습니다.예를 들어 0x0 및 전체 주소 범위가 유효한 주소인 시스템에서 사용할 수 있습니다.

또한 NULL 포인터 사용 시 충돌하지 않는 특수 C 프로그램에서도 이 트릭을 사용할 수 있습니다. NULL 포인터 사용 시 충돌하지 않고 참조 해제 시스템에서도 충돌하지 않습니다.잘못된 동작으로 이어지지만 특정 상황에서는 디버깅에 도움이 될 수 있습니다.

정당:

int *a = (int*)&a;
cout<<"checking: \n"<<&a<<"\n"<<a;

그것은 자신을 가리킵니다.

예, 자신을 가리키는 것은 가능합니다.

int* a;
a = &a;

하지만 적어도 이렇게 명시적으로 사용할 필요는 없습니다.

언급URL : https://stackoverflow.com/questions/2532102/can-a-pointer-ever-point-to-itself

반응형