2011-07-21 46 views
5

林很困惑這就是這兩個初始化之間的差異:的C指針數組Initializtion

int (*p)[10]; 

int *p[10] 

我知道他們都可以指向二維數組,其元素的行數爲10 ...

+0

在C++ - faq文章中詳細討論過(其中很多也適用於C):http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c – Cubbi

+0

http:// cdecl。org – sidyll

回答

2

爲了詳細說明正確答案有點這裏已經:

第一行:

int (*p)[10]; 

聲明「p」是一個指針陣列的具有10的容量的存儲器地址整數。它可以用英文讀作:「整數指針'p'指向內存中的10個連續整數」。

第二行:

int *p[10] 

宣告 「P []」 是10個指向整數數組。這是一組指向整數的內存地址。在這種情況下,「p」是內存中的10個指針的序列(正好是其他內存的內存地址)。

+0

尼斯!日Thnx!這將清除我的疑惑...... – kHAzaDOOm

+1

對於第二種情況,我想你的意思是說''p「 - 是一個內存中的10個指針序列(它恰好是整數的內存地址)。」# –

+0

是的!對困惑感到抱歉。 – AlexFZ

0

在第一個定義(不初始化),p是一個指針;在第二個,p是一個10個指針的數組。

+0

可以提供一個區分兩個例子...... – kHAzaDOOm

+1

嘗試'sizeof p'兩個定義:-) – pmg

4

首先是一個指針陣列,第二個是一個指針數組。

1

在第一個示例中,p是指針的10個整數數組。在第二個例子中,p是一個由10個指針組成的數組。

可以動態地分配類型的對象「指針10點INT的陣列」,如下所示。

int (**ptr)[10] = new (int (*)[10]); 

注意,沒有分配任何整數的空間;只有指針本身。

如下您可以分配10個整數數組:

int *ptr = new int[10];

你不能做什麼(沒有明確鑄造)是一個指向10爲int的動態分配的數組分配給指針類型爲int (*)[10]。無論何時通過新分配一個數組,即使使用typedef,新表達式的類型都是指向數組的第一個元素的指針;數組的大小不保留在新表達式的類型中。

這是因爲new[]表達式可以分配在運行時選擇數組大小的數組,因此將數組大小編碼爲新表達式的類型並不總是可能的(或者甚至是理想的)。

正如已經提出,可以動態地分配10 INT的一個陣列的陣列。第一個數組的大小從類型信息中丟失,並且您得到的是指向四個int數組的第一個元素(大小爲1)的指針。

int (*p)[10] = new int[1][10]; 

即使是隻有1(10整型數組)的數組,你仍然需要使用delete[]取消分配p

delete[] p;

當然,一個人永遠不能實際上是需要調用手動刪除的位置。

2
int (*p)[10]; 


+------+       +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 
| p | =========================>|(*p)[0]|(*p)[1]|(*p)[2]|(*p)[3]|(*p)[4]|(*p)[5]|(*p)[6]|(*p)[7]|(*p)[8]|(*p)[9]| 
+------+       +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 

sizeof p將返回sizeof (void *)(4上32位系統中,8上的64位系統)

sizeof *p將返回(在大多數系統40)10*sizeof (int)

int *p[10]; is the same as  int* (p[10]); 

p 
+------+------+------+------+------+------+------+------+------+------+ 
| p[0] | p[1] | p[2] | p[3] | p[4] | p[5] | p[6] | p[7] | p[8] | p[9] | 
+------+------+------+------+------+------+------+------+------+------+ 

sizeof p將返回10*sizeof (void *)( 40位32位系統,80位64位系統)

sizeof *p將返回sizeof (int *)(4上32位系統中,8在64位系統)

+0

只是想評論和讚揚你對這個答案的深度和細節。去ASCII圖紙! – AlexFZ

0

正如其他人指出的那樣,int (*p)[10]聲明p作爲指針的int 10元件陣列,而int *p[10]聲明p作爲10-指向int的指針元素數組。

在C中,聲明是圍繞表達式的類型構建的,而不是對象。這個想法是,聲明的形式應該與代碼中使用的表達式的形式相匹配。

假設p是指向int(第二種情況)的指針數組。要訪問一個特定的整數值,你下標到數組和間接引用的結果,如

x = *p[i]; 

Postfix的運營商如[]()比一元運算符像*更高的優先級,所以上面的語句解析爲(IOW,*適用於表達式p[i])。

的類型表達*p[i]int的,所以p相應聲明int *p[10];

現在我們假設p是一個指向int數組的指針(第一種情況)。要訪問一個特定的整數值,你最好取消引用指針,然後標中的結果,如

x = (*p)[i]; 

同樣,因爲[]的優先級高於*,我們需要使用括號明確的*只關聯p,而不是p[i]。表達式(*p)[i]的類型爲int,因此p的聲明爲int (*p)[10];