2016-07-15 118 views
2

我很新的指針的概念,最近遇到這行代碼來:C++數組分配地址的指針

int arr[]={1,2,3}; 
int (*p)[3] = &arr; 

是什麼上面的代碼行,這之間的區別:

int arr[]={1,2,3}; 
int *p = arr; 

而且爲什麼這給錯誤:

int arr[]={1,2,3}; 
int *p = &arr; 
+1

我想你應該在別處學習編程,因爲這裏的人不喜歡它。例如http://www.cplusplus.com/doc/tutorial/ –

+1

這是一個不錯的問題,除了第三部分是標準的數組衰減並在這裏很好地解釋:[什麼是數組衰減?](http:///stackoverflow.com/questions/1461432/what-is-array-decaying) – user4581301

+0

這是一個「類型」的東西。一旦你可以準確地描述每種情況下'p'的*類型*和你分配給它的表達式的類型*,清晰度將是自我揭示的,這既是爲什麼前兩個例子編譯沒有投訴,爲什麼第三不會。 – WhozCraig

回答

4

差分

int (*p)[3] = &arr; 

類型的pint (*)[3],即指針的3陣列int s。

在該類型的p

int *p = arr; 

簡直是int*,即一個指向int

因此,

在第一種情況下,

*p計算結果爲3 int秒的陣列,即int [3]

在第二種情況下,

*p計算結果爲只是一個int


要獲得arr第一要素,你就必須在第一種情況下使用(*p)[0]p[0][0]

要獲得arr的第一個元素,您必須在第二種情況下使用*pp[0]


要獲得arr最後一個元素,你就必須在第一種情況下使用(*p)[2]p[0][2]

要獲得arr的最後一個元素,您必須在第二種情況下使用*(p+2)p[2]

2

只是它們不一樣的東西。

int arr[]={1,2,3}; 
int (*p1)[3] = &arr; // pointer to array (of 3 ints) 
int *p2 = arr;  // pointer to int 

p1是指向陣列(3個整數),然後初始化爲指向arrp2是一個指向int的指針,作爲array-to-pointer decay的結果,它被初始化爲指向arr的第一個元素。

然後可以使用它們作爲:在類型

(*p1)[0]; // same as arr[0] 
p1[0][1]; // same as arr[1], note p1[1] will be ill-formed. 
p2[0]; // same as arr[0]