2012-03-05 2 views
1

역 참조 :참조/x는 L 값 (의 변수를 가정 해 봅시다), 다음 정체성 유지가 ID를

X == * (& x)를

이 설명하는 것은 매우 쉽다

, & x가 x에 대한 포인터이기 때문에 & x에 적용된 역 참조 연산자 *가 x를 반환합니다.

이제 대화가 의미가 있는지 궁금합니다. 내가 궁금 정확하게하려면 경우

P는 == & (* P) ​​

페이지가 아닌 허상 포인터입니다

. * p는 그 자체가 L 값 (주소가있는 값)이기 때문에 의미가있는 것처럼 보입니다. 왜냐하면 * p는 이미 포인터 (= 주소) p가 있기 때문입니다. 그러므로 오직 & (* p)가 p가 될 가능성이 없으므로 그러한 포인터는 고유하다는 것을 알아야합니다.

따라서 두 ID가 모두 참일 때 수학적으로 *와 &은 서로 역함수라고 말할 수 있습니다.

맞습니까? 이 혐의 규정에 예외가있을 수 있습니까?

+1

'p '가 포인터가 아닌 경우'& (* p)'를 수행 할 수 없습니다. – karlphillip

+0

...하지만 질문은 이미 "p가 매달리지 않는 포인터"라고 말합니다. –

+0

아마도 "adjoint functors"는 "inverses"보다 더 나은 용어 일 것입니다. 왜냐하면 두 가지가 다른 종류의 것들에서 작동하기 때문입니다. –

답변

3

p이 개체 포인터 인 경우 &*pp과 같습니다. *p의 평가는 발생하지 않으며 이는 C 표준에서 보장합니다. 여기

char *q, *p = NULL; 
q = &*p; // equivalent to q = p; 

표준의 중요한 항이다

(C99, 6.5.3.2p3) "피연산자 단항 * 연산자, 연산자 그 둘의 결과 나 작업자 &이면 연산자에 대한 제약 조건이 여전히 적용되고 결과가 lvalue가 아닌 경우를 제외하고는 결과가 둘 다 생략 된 것처럼 평가됩니다. "

편집는 : @ 코멘트 ldav1s 후, 나는 단어 포인터-개체 포인터을 변경했습니다. 실제로 pvoid * 인 경우 &*p은 유효하지 않습니다. 자세한 내용은 결함 보고서 # 102의 C위원회에서 논의했습니다. http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_012.html

+0

+1. 그러나'p'는'void * '가 될 수 없습니다. 왜냐하면'void *'를 역 참조 할 수 없기 때문입니다. – ldav1s

+0

@ ldav1s가 동의합니다.'p'는'void * '가 될 수 없습니다. * 포인터 대신 * 객체 포인터 *에 대한 내 대답을 편집했습니다. – ouah

+0

아주 좋은 대답입니다. 흥미로운 점은 & * p 자체가 L 값이 아니기 때문에 q = &(&*p);과 q = & p; 같은 것을 할 수 없다는 것입니다. 문제 없습니다. 이 이론의 뒷부분에있는 이론적 근거는 적어도 이론적으로 * p는 p 뒤에있는 값의 복사본이 될 수 있으므로이 복사본의 주소는 p 자체와 다릅니다. 아니면 과소 평가하고 말이 안되나요? – Anthales