【C语言补漏】 指针和二维数组
二维数组的定义二维数组的其实就是在一维数组上进行扩展的。 假设我们已经定义了一个二维数组array如下: array表示的是什么?array是二维二维数组的首地址。由于是二维数组,也就是指向包含五个元素的数组的指针。跨度是五个元素。 下面的例子: #include int main() { int array[4][5]; int i,j; int k = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { array[i][j] = k; k++; } } printf("size of int : %dn",sizeof(int)); printf("array : %pn",array); printf("array+1 : %pn",array+1);//array包含了五个元素的指针 } 运行结果: size of int : 4 array : 000000EFC48FF530 array+1 : 000000EFC48FF544 请按任意键继续. . . array 与array +1的地址相差14 十进制上也就是20,4×5 = 20,也就是说,两者5个int类型的跨度。 所以, array :指向包含五个元素的数组的指针,也就是第一行的首地址; array +1:同样是指向包含五个元素的数组的指针,是第二行的首地址; *(array +1)表示什么由上面可知,array +1:是第二行的首地址,所以*(array +1) 应该是二维数组array的第二行第一列的数据,=array[1][0]?用下面程序验证一下;? #include int main() { int array[4][5]; int i,j; int k = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { array[i][j] = k; k++; } } printf("*(array+1) : %dn",*(array + 1)); printf("array[1][0] : %dn",array[1][0]); } 运行结果: *(array+1) : -1225787644 array[1][0] : 5 请按任意键继续. . . O(∩_∩)O哈哈~,显然不是!!! 事实上是这样的 *(array+1) ==array[1] 请看下面你的程序 #include int main() { int array[4][5]; int i,j; int k = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { array[i][j] = k; k++; } } printf("array+1 : %pn",array + 1); printf("*(array+1) : %pn",array[1][0]); printf("**(array+1) : %dn",**(array + 1)); } 运行结果: array+1 ?: 0000002C089EF644 *(array+1) : 0000002C089EF644 array[1][0] : 5 **(array+1) : 5 请按任意键继续. . . 这样就验证了?*(array+1) ==array[1],就是指向第二行第一个元素的地址。 **(array+1)? = array[1][0] *(*(array+1)+3)表示什么意思呢?不难推断,*(array+1)+3应该是指向第二行第三列元素的指针;*(*(array+1)+3)是第二行第三列的元素 看下面的代码 #include int main() { int array[4][5]; int i,j; int k = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { array[i][j] = k; k++; } } printf("&array[1][3] : %pn",&array[1][3]); printf("*(array+1)+3 : %pn",*(array + 1) + 3); printf("array[1][3] : %dn",array[1][3]); printf("*(*(array+1)+3) : %dn",*(*(array + 1) + 3)); } 运行结果: &array[1][3] ?: 000000D35575F7F0 *(array+1)+3 : 000000D35575F7F0 array[1][3] : 8 *(*(array+1)+3) : 8 请按任意键继续. . . 结果果然不出所料。 结论*(array+i) == array[i] *(*(array+i)+j) == array[i][j] *(*(*(array+i)+j)+k) == array[i][j][k] ★finished by songpl,2018.12.18 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |