2011-01-27 152 views
0

當我做了如下聲明:C++指針 - 衝突的聲明和指針到指針

int b; 
int c; 
int *b; 
int *c; 

我得到了以下輸出編譯時:

enter image description here

注:我m使用Cygwin控制檯,這就是爲什麼我不能複製粘貼輸出

那麼,我們在這裏得出結論:w我們宣佈一個pointer變量,它是在同一時間一個普通的varibale,可以保存自己的數據?換句話說,一個具有地址和值的內存位置?

我在問這個,因爲我想試試pointer-to-pointer

如果我有'INT ** C」例如,我怎樣才能使它保持以下內容:(二)/地址

值(B)/的(A)/地址值(a)

而且,有沒有int ***c

非常感謝。

+0

您可以複製出Windows控制檯。 – 2011-01-27 16:23:43

回答

1
int b; 
int *b; 

顯然,這解釋了您看到的錯誤。

你怎麼能聲明兩個變量與相同的名字?兩個同名的變量引起衝突!

出於同樣的解釋,也是:

int c; 
int *c; 

兩個變量同名,因此衝突!

2

你在相同的範圍內聲明兩個具有相同名稱的變量。這是不允許的。

1

指針是一個存儲內存地址的變量。所以,是的,它有一個價值和一個內存地址。

int *p = 0; int **pp = &p。這是有效的,p是一個存儲在堆棧中並具有值0和一些存儲器地址的指針; pp也分配在堆棧上,具有另一個內存地址並保存內存地址p

內存地址必須存儲在某個地方並且需要固定的存儲量。例如,根據您的實現,內存地址可以存儲在四個字節中。在這種情況下,必須

  • sizeof(char) = 1
  • sizeof(char *) = 4
  • sizeof(任何其他指針類型,包括指針的指針) = 4。

因此,通過執行reinterpret_cast是你的指針可以存儲任何類型的佔用四個字節。但你爲什麼要這麼做呢?

1

是的,指針是一個常數變量,它具有值並佔用一些內存。你得到錯誤的原因與此無關,只是因爲你試圖用相同的名稱聲明兩個不同的東西。

當然,你可以有指向指針的指針,甚至可以指向指向這個錯誤的指針或甚至更多級別的指針。唯一的問題是如何使用它們。我可以想象有很多用於指針指針的用法。對於更多的層次,我只能想象一個「數組數組」的使用類型,但它仍然是一些東西。

但是你不應該做的是將錯誤類型的值存儲在變量中。如果你有一個指針的指針,你應該儲存一些指針的地址(正確的類型)那裏,沒有別的,例如:

int a; 
int *b = &a; 
int **c = &b; 

在這個例子中,這將是絕對錯誤的存儲的值a在c中,儘管在int和指針具有相同大小的平臺上是可行的。但這就像將一個文本字符串存儲在一個 - 絕對毫無意義和危險的。

1

讓我們來教你一些基礎知識。

int b; 

b爲int類型,保存的積分值,如3,-28的變量,49382

int *b; 

b爲保存一個指針int類型*的變量。它可以是NULL或指向包含int的變量。因爲它不是const int *,所以你可以寫入並讀取它。只要它們沒有const(或volatile)限定符,你可以移動它來指向不同的int變量。您也可以使用指針指向某些動態分配的內存或這樣的數組的開始(例如,int *b = new int;int *b = new int[N])或指向靜態數組中的某個位置。

所以b是一個整數變量或一個指針變量。它不能兼而有之。

要回答你的最後一點,是的,你可以有指針的指針,並且在深度沒有限制,儘管這顯然變得不可讀有int *******p

+0

因此,如果我有一個`int *`類型的變量,這是否意味着該變量將保存的值是一個「內存地址」?在這種情況下,`int **`類型的變量將保持什麼?謝謝 – Simplicity 2011-01-27 16:33:55

1

因此,我們得出結論:在這裏,當我們聲明一個指針變量,它同時也是一個可以自己保存數據的普通varibale?換句話說,一個具有地址和值的內存位置?

是的,這是完全正確的。指針是一個保存地址的變量。在你的代碼中,你已經聲明瞭兩個具有相同名字的變量(在同一個命名空間中)。這是不允許的。