c 返回二維陣列 C的指標(三)指標和二維陣列

2021-10-18 10:59:31 字數 3999 閱讀 6204

對於二維陣列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 ...