您的位置:首页 > 编程语言 > C语言/C++

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

2017-08-26 15:53 309 查看
假设有如下声明

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 中文第五版》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息