C语言中二维数组与指针的笔记

时间:2022-09-06 08:42:22

假设有如下声明

int arr[3][2];/*整数数组的数组*/

数组名arr同时也是数组首元素arr[0]的地址
arr = &arr[0],有 *arr = arr[0]
同时,arr[0]本身是包含两个int的数组,所以可以得出arr[0]的值等于其包含数组的首元素arr[0][0]的地址
arr[0] = &arr[0][0],有 *arr[0] = arr[0][0]
由上面两个表达式可以得出:
**arr = arr[0][0];
因此,我们知道,在指针与二维(或多维)数组进行操作时,涉及到需要对指针进行取值时,需要使用两次(或多次)取值才能得到通常的数值。

再来看一个复杂点的例子,假设有:

* ( *(arr + 2)+ 2 )

问题:算出上面这个语句的值。
我们先来看看,因为arr = &arr[0]的,则 arr + 2的结果指向了第三个包含两个int数组的元素的地址,可以写成arr + 2 –> &arr[2];
接着*(arr + 2 ),结果为*&arr[2],即arr[2],又有arr[2]的地址也是其首元素arr[2][0]的地址,所以arr[2] = &arr[2][0];
此时*(arr + 2)–> arr[2] –> &arr[2][0] ,此时指针指向的是arr[2][0]的地址,操作*(arr + 2)+ 2就是把指针指向了数组元素arr[2][0]的下两个元素,也就是&arr[2][2]
操作* ( *(arr + 2)+ 2 )
也就是对&arr[2][2]
进行取值了,最终结果为arr[2][2]。

初学者对指针和二维数组关系的简单理解,有错误希望大家多多指点,谢谢。

参考文献:《C Primer Plus 中文第五版》