我已經通過C++工作底漆,我覺得好像有什麼東西還沒有被解釋清楚......什麼是指向x個整數的數組的指針?
我明白它的意思有一個指針數組int
S,例如:
int *foo [4];
或
int *foo1 [2][4];
不過,我不明白是什麼意思,有一個指針數組的一些int
s。下面是一本書的例子:
int ia[3][4];
int (*p) [4] = ia;
什麼是p
這裏了,這是什麼意思,無論是在1D和2D情況?
我已經通過C++工作底漆,我覺得好像有什麼東西還沒有被解釋清楚......什麼是指向x個整數的數組的指針?
我明白它的意思有一個指針數組int
S,例如:
int *foo [4];
或
int *foo1 [2][4];
不過,我不明白是什麼意思,有一個指針數組的一些int
s。下面是一本書的例子:
int ia[3][4];
int (*p) [4] = ia;
什麼是p
這裏了,這是什麼意思,無論是在1D和2D情況?
當聲明等
int array[137];
一個變量的變量array
是int[137]
的類型;也就是一組137 int
s。在C++中,您可以創建指向任何類型變量的指針或引用,以便您可以創建指向變量array
的指針。由於array
具有類型「137 int
s的數組」,所以指向array
的指針將具有類型「指向數組137 int
s」的指針。寫了這樣一個指針的語法是
int (*arrayPtr)[137] = &array;
這被解讀爲「arrayPtr
是一個指針,它指向的是137 int
秒的數組。」這裏的語法是不尋常的,但如果你想要一個指向137個整數數組的指針,那你就會這麼做。
同樣,你可以做一個參考到array
這樣的:
int (&arrayRef)[137] = array;
這是非常少見的指針數組實際使用的任何地方 - 我從來沒有見過它,除非在非常特殊的模板的情況下完成。 參考文獻數組有時用於模板編程,但除此之外,我從未在任何地方見過它們。
換句話說,知道這些存在並知道如何閱讀它是很好的,但實際上你不可能需要它們,除非你開始做一些非常高級的庫開發或者喜歡使用模板巫術。
當你將數組指針衰減歸入混合時,這會變得更加怪異。你有示例代碼基本上是
int myArray[137][42];
int (*arrayPtr)[42] = myArray;
類型的arrayPtr
是「指針的42 int
秒的陣列」,這是int (*) [42]
類型。那麼,爲什麼我們可以分配myArray
,其類型爲int[137][42]
?這是陣列到指針的衰減踢入。陣列到指針衰減是一種隱式轉換,它將數組轉換爲指向其第一個元素的指針。讓我們看看這是如何適用的。
myArray
是由42個整數組成的137個數組的數組。這可以是「一組137個事物,每個事物都是一個int[42]
」。這意味着當數組到指針衰減適用於myArray
時,它將轉換爲指向其第一個元素的指針。該元素本身是一個由42個整數組成的數組,因此應用數組到指針衰減的效果是表達式myArray
隱含地轉換爲int (*) [42]
(指向由42個整數組成的數組的指針),具體而言,指向第一個行中的數組。
此作業的淨效果是arrayPtr
現在指向myArray
中的第137個數組。這簡直太奇怪了,如果你問我,我不會建議這樣寫代碼。我多年來一直在編寫C++,從未有過在任何地方看到這種情況的不幸,所以我認爲將這一部分記錄爲「只有圖書館實施者需要擔心的奇怪邊緣情況」是安全的。 :-)
不。沒有指向數組的指針。 – SergeyA
@SergeyA你確定嗎?我相信我以前見過這種用法。我知道「它編譯」是這樣的一個糟糕的理由,但這在ideone.com編譯:http://ideone.com/0olpbL – templatetypedef
是的,它編譯。但是你最終會得到一個指向第一個元素的指針。 – SergeyA
int (*p) [4];
裝置
p
是一個指針4個INT元素的數組。
通過括號覆蓋規則,在這種情況下,指針*
優先於數組[]
。所以,p
首先是一個指針。
int ia[3][4];
int (*p) [4] = ia;
基本上這裏p會保存ia矩陣每一行的起始地址。
p[0] = &ia[0];
...
生命期建議:始終使用適當的變量名稱。例如:IntArray,MyPointer,My2dArray .. etc –
我認爲這些變量名稱只是爲了表示目的而縮短的,因爲這些例子來自book C++ primer,但是,我完全同意你的意思100% –
這是不可能的獲取一個指向數組的指針。數組幾乎總是衰減,指向它們的第一個元素。 – SergeyA