2016-02-22 58 views
8

我在用C++編寫代碼的時候,我不小心把括號放在了我的指針上,我的程序輸出改變了。這些類型的指針有什麼區別?

由於我新的編程,我想知道這些類型的指針之間的區別:

int* A[n]; 
int (*A)[n]; 
int *(A[n]); 

我在教科書陣列也是一種指針讀取。

+1

數組可以*衰減*到指向其第一個元素的指針,但它不是指針。例如,當你將一個數組傳遞給一個函數或使用指針算術時,就會發生這種衰減。 –

+1

@JoachimPileborg將數組傳遞給一個函數*,其參數是一個指針*。它基本上是使用數組的名稱來初始化或分配給一個指向它的指針,而不是傳遞給一個函數。 – juanchopanza

+0

瞭解順時針螺旋規則,您再也不會對複雜的聲明感到困惑。 HTTP://計算器。com/a/31789222/3758484 – johnbakers

回答

15
int* A[n]; 

無論元素是什麼類型,第一個也是最重要的是一個數組。在應用指針*之後,我們知道A是一個int指針數組。

int (*A)[n]; 

通過使用括號,在這種情況下,指針*的優先級高於數組[]。然後A首先是一個指針,不管它指向什麼。應用array []後,我們知道A是一個指向int數組的指針。

int *(A[n]); 

括號不會改變任何優先順序會影響陣列[],因此去除括號將一代產量int* A[n]相同的第一殼體。

Are array pointers? 

號數組是分配內存池,並存儲數據,其中順序地作爲指針指向一個特定的索引在存儲器池和參照存儲在該存儲器位置中的數據的數據結構一個。

+0

技術上來說,數組* *是指針C. * – Shark

+14

@Shark不,數組可以*衰減*指向它們的第一個元素,但是數組本身不是指針。 –

+4

@Shark'sizeof'將會不同。 – juanchopanza

2

本文包含在閱讀類型聲明很好的例子在C. http://www.unixwiz.net/techtips/reading-cdecl.html

基本上,你可以按照下面的優先順序讀出類型:

  1. (括弧經常)內最大的類型

  2. 右鍵大多數類型(晴數組類型:[])

  3. 最左邊的類型,除最外面的一個(主要的指針類型:*)

  4. 最外側的類型(晴原始類型:整數,炭..)

例如,你提出的類型可以讀出如下:

int* A[n]; // An array ([n]) of pointer (*) of int. 
int (*A)[n]; // A pointer (*) of array ([n]) of int. 
int *(A[n]); // An array ([n]) of pointer (*) of int. 

所以基本上,第一和第三種類型是相同的。