2013-04-21 4 views
0

역 참조 포인터의 실제 메커니즘 (컴파일러가 실제로 수행하는 기능)에 관해서는 약간의 고민이 있습니다.포인터 역 참조 : 컴파일러의 실제 메커니즘

#include <iostream> 

int main() 
{ 
    int a = 5; 
    int* ptr = &a; 
    int** pptr = &ptr; 
    int*** ppptr = &pptr; 
    int**** p4tr = &ppptr; 

    std::cout << "a = 5 \nint*ptr = &a \nint** pptr = *ptr\nint*** ppptr = &pptr\nint**** p4tr= &ppptr\n" << std::endl; 
    std::cout << "a: " << a << std::endl; 
    std::cout << "&a: " << &a << std::endl << std::endl; 
    std::cout << "ptr: " << ptr << std::endl; 
    std::cout << "*ptr: " << *ptr << std::endl; 
    std::cout << "&ptr: " << &ptr << std::endl << std::endl; 
    std::cout << "pptr: " << pptr << std::endl; 
    std::cout << "*ptr: " << *pptr << std::endl; 
    std::cout << "**pptr: "<< **pptr << std::endl; 
    std::cout << "&pptr: " << &pptr << std::endl << std::endl; 
    std::cout << "ppptr: " << ppptr << std::endl; 
    std::cout << "*ppptr: " << *ppptr << std::endl; 
    std::cout << "**pptr: " << **ppptr << std::endl; 
    std::cout << "***pptr: " << ***ppptr << std::endl; 
    std::cout<< "&pptr: " << &ppptr << std::endl << std::endl; 
    std::cout << "p4tr: " << p4tr<< std::endl; 
    std::cout << "*p4tr: " << *p4tr<< std::endl; 
    std::cout << "**p4tr: " << **p4tr<< std::endl; 
    std::cout << "***p4tr: " << ***p4tr<< std::endl; 
    std::cout << "****p4tr: " << ****p4tr<< std::endl; 
    std::cout << "&p4tr: " << &p4tr<< std::endl << std::endl; 

    return 0; 
} 

제공합니다 :-(

내가 여러 포인터와 간단한 프로그램을 작성

나는 구글을 통해 여기에 유래에에 많은 빨간색,하지만 난 아직은 그것을 얻을 coulnd't 나 내 컴퓨터에 : 내가 알아 낸 무엇

a = 5 
int*ptr = &a 
int** pptr = *ptr 
int*** ppptr = &pptr 
int**** p4tr= &ppptr 

a: 5 
&a: 0x7fffe4db870c 

ptr: 0x7fffe4db870c 
*ptr: 5 
&ptr: 0x7fffe4db8700 

pptr: 0x7fffe4db8700 
*ptr: 0x7fffe4db870c 
**pptr: 5 
&pptr: 0x7fffe4db86f8 

ppptr: 0x7fffe4db86f8 
*ppptr: 0x7fffe4db8700 
**pptr: 0x7fffe4db870c 
***pptr: 5 
&pptr: 0x7fffe4db86f0 

p4tr: 0x7fffe4db86f0 
*p4tr: 0x7fffe4db86f8 
**p4tr: 0x7fffe4db8700 
***p4tr: 0x7fffe4db870c 
****p4tr: 5 
&p4tr: 0x7fffe4db86e8 

, 어떻게 되 참조가 작동합니다 : INT * PTR = & A를하며 "변수"PTR 유형입니다 컴파일러를 알려줍니다 "int *"(interger에 대한 포인터; 즉 메모리 주소) 따라서 * ptr을 쓸 때 컴파일러는 ptr의 값을 받아 주소로 가져와 int 형식으로 저장된 주소를 해석합니다.

지금까지 그렇게 좋았습니다.

하지만 int ** pptr = & ptr은 실제로 컴파일러를 의미합니까? pptr이 "int **"유형인지 여부를 나타 냅니까? 또는 여전히 의미합니까 PPTR 유형의 "INT *"

두 번째 별표 실제로 컴파일러에 무엇을 의미합니까 왜 내가 수 없습니다 (내가 & A와, & PTR이 좋은 메모리 주소를 의미)입니다 쓰기 : "INT는 * PPTR = & PTR은" 이

이 당신의 노력 주셔서 너무 감사합니다 (적어도 g ++ 나에게 그렇게 못하게) 일이 나에게 unlogical 보일 경우, 그것은 :-), 내 머리 아파)

+3

"내 머리가 아파요"- 걱정 마세요. 이것은 가장 숙련 된 C++ 전문가의 두뇌까지도 아프게합니다. [별표 3 개 프로그래머가 되려고하지 마십시오.] ( –

+1

포인터는 단지 주소 일뿐입니다. 다른 사람의 주소를 가져 와서 종이에 적어 둘 수 있습니다. 그리고 나서 다른 쪽지에 종이를 남겨 놓은 부분을 적을 수 있습니다. –

+0

@ H2CO3 "three-star-programmer"... 이것은 나의 날 (밤)을 만들었다! – hh4rsan

답변

2

하지만 실제로 int** pptr = &ptr은 컴파일에 어떤 의미가 있습니까? 그렇지? pptr이 int** 유형을 의미합니까?

예, 입니다. int**이고 포인터는입니다. 따라서 *pptrint* 유형이고 **pptr 유형은 int 유형입니다.

왜 쓸 수 없습니까? int* pptr = &ptr?

음, ptr의 유형은 int*입니다. 그래서 &ptrint* 변수와 지정이 호환되지 않는 int** 유형을 가지고 있습니다. 에 대한 포인터는 에 대한 포인터이며에 대한 포인터입니다.

+0

확인.이것은 논리적으로 보인다. 이 책이 * "int *"라고 쓰는 이유는 다음의 숫자가 주소라는 것입니다. ("char"는 컴파일러에게 그 문자를 알려주는 것과 같습니다) 컴파일러에게 알려주는 형식 일뿐입니다. 책이 잘못 되었나요? 왜냐하면 int **가이 책의 정의와 모순이 될 것이기 때문입니다. * This is the text passage : http://textuploader.com/?p=6&id=Ehnbg – hh4rsan

+0

'int *'는'int'에 대한 포인터입니다. 'int **'는'int *'에 대한 포인터입니다. 'int ***'는'int **'에 대한 포인터입니다. 등등. 나는 당신이 모순이라고 생각하는 것에 대해 정말로 확신하지 못합니다. –

+0

Whoos .. 텍스트가 조금 엉켜있어. 실제 버전은 다음과 같습니다. http://textuploader.com/?p=6&id=7zLWy – hh4rsan