2011-12-23 94 views
46

我有一個關於指向2d數組的指針的問題。如果陣列是類似的指向2d數組的指針

int a[2][3]; 

然後,這是一個指針數組a

int (*p)[3] = a; 

如果這是正確的,我想知道是什麼[3]int(*p)[3]是什麼意思?

回答

35

而不是將int[2][3]稱爲'2d數組',您應該認爲它是'數組數組'。它是一個包含兩個項目的數組,每個項目本身就是一個數組,其中包含3個整數。

int (*p)[3] = a; 

您可以使用p以指向這兩個項目的ap指向一個三int數組 - 即第一個這樣的項目。 p+1會指向第二個3-int數組。要初始化p指向第二元件,使用:

int (*p)[3] = &(a[1]); 

以下是等價的方法,以指向第一兩個項目。

int (*p)[3] = a; // as before 
int (*p)[3] = &(a[0]); 
+2

你甚至可以編寫'[3] a' :)這是學習C中真正的數組的好方法。 – vsz 2011-12-23 16:00:59

+0

@vsz,我無法決定這是真的很酷,還是真的很瘋狂:-) – 2011-12-23 19:23:48

+9

@vsz:你的意思是'3 [a]'。 – 2011-12-23 22:55:53

5

[3]是該類型的一部分。在這種情況下,p是指向保存整數的大小爲3的數組的指針。

數組的特定類型始終包含其大小,因此您具有類型int *[3]int *[5],但不僅僅是大小未定義的int *[]

int *x[20]; /* type of x is int *[20], not just int *[] */ 
int y[10][10]; /* type of y is int[10][10], not just int[][] */ 
+0

感謝您的評論。當你說大小,它是否意味着(* p)有[0],[1]],[2]?如果是這樣的話,[2]的空間在哪裏?還是它指向[0] [0]和[0] [1]? – user1047092 2011-12-23 15:11:41

+0

'p'只是一個指向3個數組的指針。它不知道'a'的第一維是2,因爲它被分配給'a'的第一個元素,它的類型'int [3]'。 – 2011-12-23 15:17:55

8

Stricly來講,沒有,int (*p)[3] = a;不是指針a。它是指向a的第一個元素的指針。 a的第一個元素是三個整數的數組。 p是一個指向三個整數的指針。

的指針陣列a將由此宣稱:

int (*q)[2][3] = &a; 

pq的數值有可能(或可能甚至需要來定)是相同的,但它們是不同的類型。當您在pq上執行算術運算時,這將起作用。 p+1指向數組a的第二個元素,而q+1指向剛剛超出數組a末尾的內存。

切記:cdecl是你的朋友:int a[2][3],int (*q)[2][3]

37
int a[2][3]; 

a被讀爲int數組3的數組2,它只是一個數組數組。當你寫,

int (*p)[3] = a;

它聲明p作爲指針到它是一個陣列第一個元素。因此,p指向3個數組,它是數組數組的一個元素。

考慮這個例子:

 int a[2][3] 
+----+----+----+----+----+----+ 
| | | | | | | 
+----+----+----+----+----+----+ 
\_____________/ 
     | 
     |  
     | 
     p int (*p)[3] 

這裏,p是指針指向的3個整數,其是數組的數組的元素的數組。

+0

謝謝你的幫助。這張圖有很大幫助! – user1047092 2011-12-23 15:20:19

+10

ASCII藝術的+1。我想是正確的。 – 2011-12-23 15:21:19

+0

不會「p」變成3個整數指針的數組,第一個值指向第一個值「a」? – Matthew 2011-12-23 17:19:33

0

另外注意: -

INT * P [5] // p是5個指針

INT(* P)[5] // p個點的陣列,以陣列5 ints

int(*(p + 5))[10] // p是一個指向結構第5個元素有10個整數的結構的指針。

+0

這是如何添加到已經有用的答案列表? – rayryeng 2015-10-25 20:25:36

+0

OP提出了一個概念性問題,我已經在這裏回答了。代替5放3 !.此外,我添加了更多關於如何使用指針從二維數組中獲取值的細節。 – BigDataScholar 2015-10-25 20:32:00

+0

我認爲這比其他答案更令人困惑。 – rayryeng 2015-10-25 20:38:39