为什么* pointer_name在1D和2D数组中的行为不同

时间:2016-08-21 13:55:25

标签: c arrays pointers

为什么在1D数组中使用*q时它会给出数组中的值,而2D数组中的*p会给出一个地址。是不是*pointer_name应该告诉存储的内容,为什么输出地址而不是40(数组中的值)?

#include<stdio.h>
int main(){
  int a[3][4] = {  
  {40, 1, 2, 3} ,   
  {4, 5, 6, 7} ,   
  {8, 9, 10, 11}   
 };
 int (*p)[4] = a;

 int b[4] = {3,4,8,5};
 int  *q = b;

 printf("%d, %d",*q, *p);// output- 3, 10485040

 return 0;
}

2 个答案:

答案 0 :(得分:3)

因为p是指向数组的指针。当您取消引用p时,数组将衰减为指向第一个元素的指针。执行*p&(*p)[0]是等效的(也等同于&a[0][0])。

如果要打印第一个元素,则需要取消引用两个指针,即**p

答案 1 :(得分:0)

2D数组表示数组数组!所以2D数组中第一行的每个槽都应该有另一个数组的地址。

例如,如果您有一个数组a[2][3],则a[0]值是大小为4的数组的第一个插槽的地址,而a[1]就是这样等。