关于多维数组的运算问题
程序员文章站
2024-03-15 20:12:24
...
《c和指针》中有一道关于多维数组的题目,引用如下:
int array[4][2][3][6];
请问 array , &array+1,array+2, array[2]-1, array[0][1][0]+2 的值和类型。在回答之前首先这个问题请思考一下,指针和数组在存取时的方式差异;
int arr[10];
int *p=arr;
在大多数情况下,arr[3] , *(arr+3) , p[3] , *(p+3) 是没有差别的,都可以存取arr中的第4个元素。然而,对编译器来说,这完全不同的执行代码。
数组和指针的标准书写方式:
arr[3] 是从 array的位置开始,移动 3个 元素的大小;
*(p+3)是读出 p的值,加上 3*sizeof(元素),取出对应内存字符。
注意到此处 “+3”的实际大小与元素的大小相关,即就是对应不同的权重:
array 和 &array
虽然两个的值相同,但是array代表数组的地址,&array 就是取整个数组的首地址,
不同的地方在于,数组名+1和数组名取地址+1,前者是第二个元素的地址,后者是数组越界后第一个元素地址。
此题的答案
array 指数组首元素的地址,即第一个三维数组的大小,类型为(*a)[2][3][6];
&array+1 对整个数组取地址加一个 array数组大小;array+2 数组中第三个三维数组的地址,类型为(*a)[2][3][6];
array[2]-1 数组中第二个三维数组中最后一个二维数组的地址,类型为(*b)[3][6];
array[0][1][0] 数组中第一个三维数组中第二个二维数组中第一个一维数组,类型为(*c)[6];
因此,在进行多维数组运算时,首先将多维数组看成低一维数组,“+”“-”低一维数组的大小。
参考文献:对多维数组的理解 http://blog.csdn.net/zhengqijun_/article/details/52015950
指针与数组的区别 http://blog.163.com/yang_ping111/blog/static/71885052200841825710944