2013-04-21 20 views
0

我對解引用指針的實際機制(編譯器實際做了什麼)的理解有點掙扎。指針解除引用:編譯器的實際機制

我紅了很多通過谷歌和這裏的計算器,但我coulnd't完全得到它尚未:-(

我寫了多個指針一個簡單的程序:

#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; 
} 

其中給出我這個在我的機器上:

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 *」(指向一個整數的指針;即存儲器地址) 因此,當我編寫* ptr時,編譯器將採用ptr的值,將其作爲地址,並將該地址處存儲的內容解釋爲int類型。

到目前爲止,這麼好。

但是,int ptr = & ptr實際上是指編譯器的意思嗎? 這是否意味着pptr是「int **」類型的? 或者它仍然意味着PPTR的類型是「int *」(我的意思是,& PTR是一個很好的內存地址爲&一)

什麼是第二個星號實際上意味着編譯器,爲什麼我就不能寫:「詮釋* PPTR = & PTR」 (至少G ++不會讓我這樣做)

非常感謝你爲你的努力, 它傷害了我的大腦,如果事情似乎unlogical我:-) )

+3

「它傷害了我的大腦」 - 別擔心。這甚至會傷害最有經驗的C++大師的大腦。不要試圖成爲[三星程序員](http://c2.com/cgi/wiki?ThreeStarProgrammer) – 2013-04-21 21:04:39

+1

指針只是一個地址。你可以把某人的地址寫在一張紙上。然後你可以寫下你把紙放在另一張紙上的地方。 – 2013-04-21 21:15:45

+0

@ H2CO3「三星程序員」......這讓我的一天(夜晚)! – hh4rsan 2013-04-21 22:27:49

回答

2

但是int** pptr = &ptr究竟是什麼意思到編譯呃?這是否意味着pptr是int**的類型?

是的,pptr的類型是int**。並且int**指向指向int的指針。所以*pptrint***pptr類型int

爲什麼我不能寫:int* pptr = &ptr

那麼,ptr有類型int*。因此&ptr的類型爲int**,它不與int*類型的變量進行分配兼容。 A 指向int的指針與指向int的指針的指針是不同的類型。

+0

好的。這似乎合乎邏輯。我還是有點困惑,因爲這本書*說「int *」只是一種用來告訴編譯器,下面的數字是一個地址(比如「char」用來告訴編譯器它的一個字母)。這本書是錯的嗎?因爲int **會與本書的定義相矛盾,不是嗎? *這是正文:http://textuploader.com/?p=6&id=Ehnbg – hh4rsan 2013-04-21 21:53:06

+0

'int *'是一個指向'int'的指針。 'int **'是一個指向'int *'的指針。 'int ***'是一個指向'int **'的指針。等等。我不確定你認爲是矛盾的。 – 2013-04-21 21:57:41

+0

哇......文字糾結了一點。這裏是實際版本:http://textuploader.com/?p=6&id=7zLWy – hh4rsan 2013-04-21 22:00:09