这里定义了一个数组:
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
的含义。
答案 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
。