2024-07-03 04:59:48
这个程序将指针p1放入输出里,是指针p1依次指向a,*a,a[0]还是有别的意思
*a是对a的取值,但a指向的数组首元素地址,那*a不应该取出地址的值0吗
p1只是一个字符数组,它的值是“%x,%x,%x,%x,%x\n”,没有任何其他意义。
如果不用p1,第一个输出语句你可以写成:
printf(“%x,%x,%x,%x,%x\n”,a,*a,a[0],&a[0],&a[0][0]);
p1的作用仅此而已。
p1永远也不会指向a,a[0]等等,也不需要p1执行它们。
另外,a是二维数组,相当于二级指针。a相当于二维数组的首地址(等于a[0][0]的地址)。*a是取得一维数组a[0]的首地址(也等于a[0][0]的地址)。
*a才是一级指针,对它取值**a才能得到a[0][0]的元素值0。
2024-07-03 03:41:31
我是这样理解的:
a是一个二维数组,也就是一个二级指针,那么a代表指向数组头的二级指针,*a代表指向数组头的一级指针,**a代表第一个数组元素。因为二维数组只是一维数组在内存地址上的连续表示,所以a和*a的区别在于它们的有效范围不同,分别是数组的两个维度的维数。
所以a和*a都是指向数组头的指针,它们都指向第一个元素,所以输出的地址相同。
证实:
#include <stdio.h>
int main()
{
int a[2][2] = {1,2,3,4};
printf("%x, %x, %d\n", a, *a, **a);
return 0;
}
输出结果:
2024-07-03 09:16:23