2016-11-15 95 views
1

我已經通過C++工作底漆,我覺得好像有什麼東西還沒有被解釋清楚......什麼是指向x個整數的數組的指針?

我明白它的意思有一個指針數組int S,例如:

int *foo [4]; 

int *foo1 [2][4]; 

不過,我不明白是什麼意思,有一個指針數組的一些int s。下面是一本書的例子:

int ia[3][4]; 
int (*p) [4] = ia; 

什麼是p這裏了,這是什麼意思,無論是在1D和2D情況?

+0

生命期建議:始終使用適當的變量名稱。例如:IntArray,MyPointer,My2dArray .. etc –

+0

我認爲這些變量名稱只是爲了表示目的而縮短的,因爲這些例子來自book C++ primer,但是,我完全同意你的意思100% –

+0

這是不可能的獲取一個指向數組的指針。數組幾乎總是衰減,指向它們的第一個元素。 – SergeyA

回答

4

當聲明等

int array[137]; 

一個變量的變量arrayint[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++,從未有過在任何地方看到這種情況的不幸,所以我認爲將這一部分記錄爲「只有圖書館實施者需要擔心的奇怪邊緣情況」是安全的。 :-)

+0

不。沒有指向數組的指針。 – SergeyA

+0

@SergeyA你確定嗎?我相信我以前見過這種用法。我知道「它編譯」是這樣的一個糟糕的理由,但這在ideone.com編譯:http://ideone.com/0olpbL – templatetypedef

+0

是的,它編譯。但是你最終會得到一個指向第一個元素的指針。 – SergeyA

0
int (*p) [4]; 

裝置

p是一個指針4個INT元素的數組。

通過括號覆蓋規則,在這種情況下,指針*優先於數組[]。所以,p首先是一個指針。

0
int ia[3][4]; 
int (*p) [4] = ia; 

基本上這裏p會保存ia矩陣每一行的起始地址。

p[0] = &ia[0]; 
...