3

可能重复:
数组名称是 C 中的指针吗?

我正在运行以下代码

#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 指向的地址相同。

这对我来说似乎有点混乱。解释是什么?

4

2 回答 2

5

数组的值a是指向数组第一个元素的指针a

指针的值&a(与指针的值和类型相同b)是指向数组的指针a

它们具有相同的值(但类型不同),因为它们都从相同的内存地址开始。在数组的开头没有填充可能。

评估时a是 typeint *并且&a是 type 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);
于 2012-10-24T18:41:50.490 回答
0

在表达式(例如 printf 的参数)上,数组被衰减为指针(指向它们各自的数组),这意味着如果“b”指向“a”,在表达式上,“a”也将是指向“a”的指针(分配给“a”的内存块)。

然而,在运行时(内部)访问元素的方式是不同的。在这种情况下,“b”将需要额外的间接。

于 2012-10-24T18:42:27.590 回答