我正在运行以下代码
#include <stdio.h>
int main()
{
int a[4] = {1,2,3,4};
int (*b)[4] = &a;
int k = sizeof(a);
printf("\n\n%d\n\n", k);
printf("a = %u, b = %u, *b = %u, data = %d", a, b, *b, **b);
return 0;
}
我得到了以下输出
a = 3485401628, b = 3485401628, *b = 3485401628, data = 1
这里我将a的地址分配给b,因为b的类型是int **,但是在输出中我得到的是a指向的地址与b指向的地址相同。
这对我来说似乎有些困惑。解释是什么?
答案 0 :(得分:5)
数组a
的值是指向数组a
的第一个元素的指针。
指针&a
的值(与指针b
的值和类型相同)是指向数组a
的指针。
它们具有相同的值(但不同的类型),因为它们都从相同的内存地址开始。数组的开头没有填充。
评估时a
的类型为int *
,而&a
的类型为int (*)[4]
。
请注意,打印指针地址的正确方法是使用转换说明符p
。如,
/* And p requires the argument to be a void *, so use a cast if
* it is not the case
*/
printf("%p %p\n", (void *) a, (void *) &a);
答案 1 :(得分:0)
在表达式(例如printf的参数)上,数组被衰减为指针(指向它们各自的数组),这意味着如果“b”指向“a”,则在表达式上,“a”也将指向“a”(为“a”分配的内存块)。
然而(在内部)在运行时访问元素的方式是不同的。在这种情况下,“b”将需要额外的间接。