2013-10-12 6 views
1

이것은 명백 할 수도 있지만 무효 포인터가 다른 포인터를 안전하게 가리킬 수 있습니까? 유형 INT *무효 포인터가 안전하게 포인터를 가리킬 수 있습니까?

int i = 5; 
int *ip = &i; 
void *vp = &ip; 

int *nip = *(int **)vp; 
int ni = *nip; // == 5? 

편집 할 수있는 즉 점 : 죄송합니다 어쩌면 내가 분명히 존재 아니에요, 난 무효 포인터가 다른 포인터의 유형이 메모리의 한 부분을 가리 할 수 ​​있는지 알고 싶습니다; 무효가되지 않고 **. 그냥 무효 *

+0

'int * nip = * vp;는'int * nip = vp;'이어야합니다. – ouah

+0

아니요, 매우 분명한 질문 이겠지만, 당신의 기여에 감사드립니다. – jayjay

+0

'int * nip = * vp;'그 답은 명백합니다.'void * '를 역 참조 할 수 없습니다. 기간. – ouah

답변

5

예, 어떤 개체 포인터를 void *으로 변환하고 정보 손실없이 원래 포인터 유형으로 되돌릴 수 있습니다. 말의 입에서

:

(C99은, 6.3.2.3p1) "무효에 대한 포인터가 또는 불완전하거나 오브젝트 유형에 대한 포인터로 변환 할 수있다 포인터를 어떤 불완전하거나 객체. type은 void 포인터와 다시 포인터로 변환 될 수 있으며 결과는 원래 포인터와 동일하게 비교됩니다. "

+0

예.하지만 다른 포인터를 가리킬 수 있습니까? – jayjay

+1

그것은 무엇이든 가리킬 수 있습니다. 포인터에 특별한 것은 없습니다. – Dolda2000

+2

@jayjay'void *'는 어떤 객체를 가리킬 수 있습니다 :'int' 또는'int *'또는'int **'. – ouah

2

예, 그것은 어떤 개체 유형 1에게 를 가리킬 수 있습니다. 컴파일러가 "실제"타입을 모르기 때문에 실제로 역 참조 void 포인터가 될 수 없습니다. 그러나 가리키는 측면이 좋습니다. C11 6.3.2.3 Pointers /1에서

:

무효 포인터 또는 어떤 개체 형식에 대한 포인터로 변환 할 수있다. 에 대한 포인터 개체 유형은 void 포인터와 다시 포인터로 변환 될 수 있습니다. 결과는 원래 포인터와 동일하게 비교되어야한다.


1/ "개체 유형"함수 포인터가 약간 더 제한적인 변환 기능, 규칙을 포함하지 않습니다.

+4

* 예, 모든 유형을 가리킬 수 있습니다. * 모든 객체 유형 *을 가리킬 수 있습니다. 함수 포인터 유형을 보유하는 것은 보증되지 않습니다. – ouah

+0

'const' 형 변환에 관한 편집이 롤백되었습니다. 당신이주의하지 않은 경우에, 이것은 C 질문이 아니고 C++ 질문이 었습니다. – paxdiablo

관련 문제