关于C中的2D数组指针

时间:2013-08-06 07:06:35

标签: c pointers multidimensional-array

这里定义了一个数组:

int a[2][5]={{1,2,3,4,5},{6,7,8,9,10}};

该陈述是什么意思?:

int *p = (int*)(&a+1);

为什么*p的输出是6?

printf("%d",*p);//6

特别是,请说明(int*)&a+1的含义。

3 个答案:

答案 0 :(得分:2)

首先注意,int a[2][5] = {1,2,3,4,5};不是完全有效的数组定义。

gcc发出警告:

  

test.c:10:3:警告:初始化器周围缺少大括号[-Wmissing-braces]

     

test.c:10:3​​:警告:(接近初始化'a [0]')[-Wateing-braces]

您的数组是2 x 5,这意味着它应该包含10个元素:int a[2][5]={{1,2,3,4,5}, {6,7,8,9,10}};是更正确的定义。

现在,问题是:int *p = (int*)(&a+1);。这声明了一个指向int nammed p的指针。 (int *)是演员。所以你基本上将(&a + 1)投射到(int *)

但是,请注意(&a + 1) a[1]不是

答案 1 :(得分:0)

像这样定义你的数组:

int a[2][5]={{1,2,3,4,5},{6,7,8,9,10}};

然后使用你的数组:

int * p = (int*)(&a[0][0]+1); 

int * p = (int*)(a+1);

答案 2 :(得分:0)

&a计算数组a的地址。 将1添加到数组的地址将增加1倍于数组所包含的大小。在这种情况下,数组a包含5 int的数组,因此表达式计算为远离数组地址的int int的地址,或者地址int 6