一些指针问题

时间:2012-10-24 18:38:39

标签: c pointers

  

可能重复:
  Is array name a pointer in 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指向的地址相同。

这对我来说似乎有些困惑。解释是什么?

2 个答案:

答案 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”将需要额外的间接。