2014-11-02 2 views
0

로컬 영역에서 전역 포인터를 사용한 다음 포인터를 사용하는 방법을 이해하려고합니다. 이렇게하면 C89 컴파일러가 이렇게 불평하지 않는다는 것을 깨달았습니다.포인터가 타입 변환없이 자신을 가리키고 있습니까?

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

심지어 바람직한가?

+1

무엇이 잘못 되었습니까? '& a'는'int **'이며, 역 참조하면'int *'가됩니다. 'a '는 그 자체를 가리 키지 않습니다 - 표현식은'a = a'와 같습니다. –

+0

잘못된 메모리 영역에 있지 않습니다. 그것은 그 자체입니다. 문제가 있습니다. 잘못된 메모리 오류를받지 않고 포인터를 일반적인 변수로 위협 할 수 있습니까? – Corelation

답변

2

로컬 영역에서 전역 포인터를 사용한 다음 포인터를 사용하는 방법을 알아 내려고합니다.

void *ptr = &ptr; 

이 (AB)

(이 경우 void **) void * 및 다른 오브젝트 포인터 타입 간의 암시 적 변환 기능을 사용

이 방법이다. ptr는 자신의 메모리 주소를 포함, 당신은 역 참조 할 수 있습니다

여기
void *qtr = *(void **)ptr; 

, qtr == ptr 사실 일 것입니다.

다른 포인터 유형으로도이 작업을 수행 할 수 있다고 생각하지 않습니다.

+0

아, 포인터에 '1'을 어떻게 할당 할 수 있습니까? – Corelation

+0

@Corelation 다음과 같이 : void * p = (void *) 1;'하지만 포인터가 그 포인터를 가리 키지는 않습니다. 이제 당신은 정말로 무엇을 달성하기를 원합니 까? –

+0

설명하기가 복잡합니다. 성취하려고하는 것이지만 불가능하다고 생각합니다. – Corelation

4

*(&a)은 단순히 a (귀하는 a의 주소를 얻은 다음 역 참조를 사용합니다)과 같습니다. 그래서 코드가 효과적으로 수행합니다

타입 시스템에 완전히 확인하고 바로 aNULL를 할당
a = a; 

. 그것이 컴파일러가 불평하지 않는 이유입니다.

+0

당신은 포인터에 능숙합니까? 정말 .. 좋아. – Corelation