一些指针问题

pri*_*jan 3 c pointers

可能重复:
数组名是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;
}
Run Code Online (Sandbox Code Playgroud)

我得到了以下输出

a = 3485401628, b = 3485401628, *b = 3485401628, data = 1
Run Code Online (Sandbox Code Playgroud)

这里我将a的地址分配给b,因为b的类型是int**,但是在输出中我得到的是a指向的地址与b指向的地址相同.

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

oua*_*uah 5

array的值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);
Run Code Online (Sandbox Code Playgroud)