對於二維陣列array[4][5]
.array
應理解為是包含四個元素的陣列,每個元素是乙個一維陣列,它們有五個元素。
例:
int mat[3][4];

陣列含義:
考慮到陣列名代表陣列第乙個元素的位址
mat = &mat[0] = mat[0] = &mat[0][0] = *mat
mat[0] + 1
指向陣列mat[0]
的第二個元素,是mat[0][1]
的位址
程式示例
下面考慮解引用和指標的運算#include int main()
; printf("sizeof int : %dn", sizeof(int));
printf("array : %pn", array);
printf("array + 1 : %pn", array + 1);
return 0;
}/*--------output--------*/
sizeof int : 4
array : 0x7ffee9ee0a60
array + 1 : 0x7ffee9ee0a74 // 跨越了五個元素
即:
程式例項// 一層解引用:
*mat = mat[0] = &mat[0][0]
*mat[0] = mat[0][0]
*(mat+1) = mat[1] = &mat[1][0]
*mat[1] = mat[1][0]
// 二層解引用:
**mat = *mat[0] = mat[0][0]
**(mat+1) = *(mat[1]) = mat[1][0]
*(*(mat+1)+1) = *(mat[1]+1) = mat[1][1]
// 總結:
*(array+i) == array[i]
*(*(array+i)+j) == array[i][j]
*(*(*(array+i)+j)+k) == array[i][j][k]
#include int main()
; int i, j, k = 0;
for (i = 0; i < 4; i++)
}printf("*(array + 1): %pn", *(array + 1));
printf("array[1]: %pn", array[1]);
printf("&array[1][0]: %pn", &array[1][0]);
printf("**(array + 1): %dn", **(array + 1));
return 0;
}/*--------output--------*/
*(array + 1): 0x7ffee924aa74
array[1]: 0x7ffee924aa74
&array[1][0]: 0x7ffee924aa74
**(array + 1): 5
int a[3][4];
a[0] = *(a+0)
,a[0]+1 = *(a+1)
分別指向第一行第一列,第一行第二列元素的位址,稱為列指標(元素指標)
行指標解引用後是列指標
這是普通指標,下面使用陣列指標。陣列指標指向乙個一維陣列,解引用陣列指標得到陣列。#include int main()
; int *p;
p = *a; // p 是列指標/一級指標,指向第一行第一列
// p = &a[0][0]; (對),也是第一行第一列的位址
// p = a; (錯), a是行指標/二級指標
for(p=a[0]; p < a[0] + 12; p++)
return 0;
}
這裡#include int main()
, };
int (*p)[3] = array;
// 一層解引用
printf("*p: %pn", *p); // 0x7ffee2b20aa0
printf("p[0]:%pn", p[0]); // 0x7ffee2b20aa0
printf("*p+1:%pn", *p+1); // 0x7ffee2b20aa4
printf("*(p+1):%pn", *(p+1)); // 0x7ffee2b20aac
// 二層解引用
printf("**p:%dn", **p); // 0
printf("*p[0]:%dn", *p[0]); // 0
printf("*(*p+1):%dn", *(*p+1)); // 1
printf("**(p+1):%dn", **(p+1)); // 3
printf("*p[1]:%dn", *p[1]); // 3
printf("**(array+1):%dn", **(array + 1)); // 3
printf("array[1][0]:%dn", array[1][0]); // 3
printf("*(*(p+1)+1):%dn", *(*(p+1)+1)); // 4
return 0;
}
p
指向array
的第一行,即四個元素的一維陣列(因為這就是array
儲存的位址資訊)p
的跨度是 3個int
,於是
將*p
看作乙個一維陣列p[0]
,跨度為int
+(*p+1) = p[0]+1
得到第一行第二個元素的位址
p+1
指向array
的第二行
將*(p+1)
看作乙個一維陣列p[1]
,跨度為int
int (*p)[3] = array+1 // 指向array的第二行
還可以這樣寫:
這裡#include int main()
, };
int (*p)[2][3] = &array;
int i,j;
for ( i = 0; i < 2; ++i)
printf("n");
}return 0;
}
p
指向這個二維陣列,先解引用*p
得到array
,後面就是一樣的了。 C 035 指標與二維陣列
指標和二維陣列的關係有點繞,需要細細分析。通過 的方式,列印位址去理解。1.定義乙個指向一維陣列的資料的指標 格式 資料型別 指標變數名稱 陣列名稱 一維陣列的下標 2.定義乙個指標的陣列 格式 資料型別 指標變數名稱 指標個數 3.定義乙個指向一維陣列的指標 格式 資料型別 指標名稱 所指向的一維...
指標系列六(指標與二維陣列)
指標與二維陣列 int array 4 5 printf sizeof int d n sizeof int printf array p n array printf array 1 p n array 1 上面程式證明 array 1,位址加了20,每乙個整形四個位元組,相當於跨越了五個位元組 ...
c 二維陣列指標
定義指標指向二維陣列 為了方便根據使用者輸入動態定義二維陣列的行和列,引入變數rowsnum 行 colsnum 列 以定義 行 列的二維陣列為例,int rowsnum 4 int colsnum 5 float a new float rowsnum for int i 0 i rowsnum ...