2016-09-16 50 views
0

在我的書中,它指出指針是地址並且有一個數值。您可以將指針的值打印爲cout < <(unsigned long)(p) 編寫代碼以比較p,p + 1,q和q + 1。解釋結果,我不知道這本書要我怎麼做,所以這裏是我的。有誰知道如果我這樣做是正確的指針值

int num = 20; 
double dbl = 20.0; 
int *p = &num; 
double *q = &dbl; 
cout << (unsigned long)(q) << endl; 
q = q + 1; 
cout << (unsigned long)(q) << endl; 

cout << (unsigned long)(p) << endl; 
p = p + 1 ; 
cout << (unsigned long)(p) << endl; 
+1

雖然在大多數實現中,'unsigned long'和一個指針的大小是相同的,但如果它宣稱您總是可以使用強制類型轉換爲'unsigned long'來打印指針,那麼您的書是錯誤的。打印指針的正確方法是將其轉換爲void *'。 –

+0

你在做這件事時有什麼疑問? –

+1

@JoachimPileborg'void *'強制轉換甚至是必要的嗎? –

回答

3

假設它是你有問題的指針運算,讓我嘗試到展示它是如何在更多的「圖形」的方式完成:

比方說我們有可變ptr一個指針,它指向整數數組,像

int array[4] = { 1234, 5678, 9012, 3456 }; 
int* ptr = array; // Makes `ptr` point to the first element of `array` 

在內存方面,它看起來像

 
+------+------+------+------+ 
| 1234 | 5678 | 9012 | 3456 | 
+------+------+------+------+ 
^ ^ ^ ^
|  |  |  | 
ptr ptr+1 ptr+2 ptr+3 

首先是技術上ptr+0

向指針添加一個指針時,您將轉到「數組」中的下一個元素。

也許現在你開始看到指針算術和數組索引之間的一些相似之處。這是因爲這裏的一個共同線程:對於任何指針或數組p和有效索引i,表達式p[i]*(p + i)完全相同。

使用p[i]等於*(p + i)的知識可以更容易理解數組如何用作指向其第一個元素的指針。我們從指向array(如上定義)的第一個元素的指針開始:&array[0]。這等於表達式&*(array + 0)。地址 - (&)和取消引用(*)運營商取消每個,使我們與(array + 0)。將零添加到任何東西都可以被刪除,所以現在我們有(array)。最後我們可以刪除括號,讓我們用array。這意味着&array[0]等於array

+1

你甚至可以寫i [p],它將被轉換爲*(i + p),它產生相同的對象,甚至是-1 [p + size],以獲得數組的最後一個元素。 –

1

如果你想要打印你的指針指向的地址的十進制表示,你做得對。

如果您想知道,爲什麼結果如此,您需要學習指針算術。如果您將1添加到任何指針,它的地址將會增加sizeof(<type>),其中type您的指針指向的變量的類型爲

因此,如果您有一個指向int的指針並將其增加,則地址將增加sizeof(int),這很可能是四。