一维数组:
代码:
#include<stdio.h>
int main(int argc,char **argv)
{
int a[5];
printf("%p\n",a);
printf("%p\n",&a);
printf("%p\n",&a[0]);
printf("\n");
printf("%p\n",a+1);
printf("%p\n",&a[0]+1);
printf("%p\n",&a+1);
}
你猜猜,前三个输出的结果是什么?你考虑考虑,再考虑考虑最后三个输出的结果。
你上机操作一下你就知道结果了。
前三个的结果一样,都是同一个地址值
后三个 a+1与&a[0]+1一样,最后一个&a+1不一样。
如果你明白为什么是这个结果,那么你就不用接着往下看了,如果你犹豫的话,那我给你解释解释。
a:代表a这个数组的第一个元素的地址,也就是a[0]的地址,所以a==&a[0]
&a:代表a这整个数组的首地址,a整个数组占有20( 等于5*sizeof(int) )个字节的这片内存区域的首地址
&a[0]:等于a
a+1:a这个数组的第一个元素的地址下移4个字节,其实是a[1]
&a[0]+1:与a+1同一个意思的不同表达
&a+1:整个a数组的首地址以a这个数组所占字节数为单位下移。地址与a相比增大20(十进制)
二维数组
代码:
#include<stdio.h>
void arr(int array[][5])
{
printf("*(*(array+1))=%d\n",*(*(array+1)));
printf("array[1][0]=%d\n",array[1][0]);
}
int main(int argc, char **argv)
{
int array[5][5] = {0};
array[1][1] = 100;
array[1][0] = 50;
printf("array=%p\n",array);
printf("array[0]=%p\n",array[0]);
printf("&array[0][0]=%p\n",&array[0][0]);
printf("array+1=%p\n",array+1);
printf("array[1]=%p\n",array[1]);
printf("*(*(array+1)+1)%d\n",*(*(array+1)+1));
printf("array[1][1]=%d\n",array[1][1]);
arr(array);
return 0;
}
二维数组的函数传参时候,必须传递数组的列数,因为,二维数组当参数传递时,传递的是二维数组的首行地址即array[0]的地址。 根据结果你就可以去判断哪些是等价的了。
array=array[0]=&array[0][0]
array+1=array[1]=*(array+1)
array[1][1]=*(*(array+1)+1)
array[1][0]=*(*(array+1))
多维数组的存储: