定義a為二維陣列後,有三種成份:陣列本身、3個一維陣列(a的每一行對應乙個一維陣列)、12個陣列元素,
由此就有三種指標及對應的指標變數,
&a和int (*p1)[3][4](沒有實用意義)、
&a[i]和int (*p2)[4](當i為0時,&a[0]可簡化為a)、
a[i][j]和int *p3;
由於指標型別匹配是完全匹配,所以初始化形式必須嚴謹。
上面有人寫出
int
(*p)[4]=&a;
則是型別不匹配,指向一維陣列的指標變數指向了二維陣列,儘管有些編譯器只給warning、儘管有人認為指標值(二維陣列a和一維陣列a[0]的位址值)是相同的,事實是型別不匹配、錯誤
還有人寫出
int *p = &a[0][0];/*或者int *p = a[0];*/
結論是
int (*p)[4]=a;/*或者int (*p)[4]=&a[0]*/
是嚴格指標型別匹配的,且p具有陣列結構資訊(列數),可以直接訪問陣列元素
*(*(p+i)+j)等價於a[i][j]
提供乙個小「伎倆」供分析用:指標(變數)左邊乙個*可等效替換為右邊乙個[],兩個*可等效替換為。。。
上面為引用自csdn的討論
寫個程式測試一下
1: #include
2:
3:int main()
4: ,,};
6:int i, j;
7:int (*p)[5] = s;//=&s[0];
8:int *q = &s[0][0];
9:
10: printf("%d ",s[0][0]);
11: printf("%d ",*s[0]);
12: printf("%d ",**s);
13:
14: printf("%d ",*(*(p+2)+2) );
15: printf("%d ",*(q+12));
16: }
二維陣列與指向二維陣列的指標
指標陣列 是陣列元素為指標的陣列,本質為陣列。int p n 陣列指標 是指向陣列首元素的指標,其本質為指標。int p n 的優先順序高於指標運算子 操縱二維陣列 int a i j int pa j pa a a 代表該二維陣列的首位址 pa 代表該二維陣列的首位址 pa 也代表該二維陣列的首位...
C語言二維陣列指標(指向二維陣列的指標)
二維陣列的定義 int matrix 見圖的操作那篇文章裡面的定義 或者這篇文章提供了另外一種方法。二維陣列在概念上是二維的,有行和列,但在記憶體中所有的陣列元素都是連續排列的,它們之間沒有 縫隙 以下面的二維陣列 a 為例 int a 3 4 從概念上理解,a 的分布像乙個矩陣 0 1 2 3 4...
C C 指向二維陣列的指標
設有整型二維陣列a 3 4 如下 0 1 2 3 4 5 6 7 8 9 10 11 它的定義為 int a 3 4 設陣列a的首位址為1000,各下標變數的首位址及其值如圖所示。c語言允許把乙個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a 0 a 1 a 2 每乙個一維陣...