关于一维数组的指针
例子:
int a[3]={1,2,3};
int *p=a;
printf("%d",*p);
输出为1
一维数组指针就是该一维数组第一元素的地址,取值运算*结果是第一个元素存储值。
再看二元数组
例子:
int v[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
int (*a)[5]=v;
printf("%p,%p\n",a,a+1);
printf("%p,%p\n",*a,*(a+1));
输出:
002BF77C,002BF790
002BF77C,002BF790
为什么a和*a的结果相同?
a[2][5]就是两个包含5个int的一维数组组成的二维数组。这个数组的每个元素(a[0]和a[1])都是一个一维数组。类比一维数组指针的解释,a指向第一个数组元素的地址,也就是a[0]地址。a[0]这个一维数组的地址就是a[0][0]的地址。所以,a==&a[0][0]。
*a的值就是第一个元素的值。*a等于数组a[0]的值。a[0]的值包含五个int。计算机不会遇到*a,就输出5个值,而是将五个值,也就是数组的首地址输出。给出首地址,进一步就能访问这五个值了。由此看出,二维数组指针是个双指针。*a==v[0]; v[0]=&v[0][0];=>**a=a[0][0]。
总结
1、二维数组指针和一维数组指针在取值运算的结果含义并不相同。一维数组指针取值结果是数组首元素的值。二维数组指针取值运算结果是首元素地址。二维数组指针取值结果的这种处理方式使得其结果是一个值。这在形式上和一维数组指针取值是相同的,但含义不同。
2、数组的地址用首地址表示,数组的值如果要用一个值输出,那就输出数组的地址。
时间: 2024-10-07 03:24:17