这里定义了一个数组:
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
意思。
这里定义了一个数组:
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
意思。
首先要注意,int a[2][5] = {1,2,3,4,5};
这不是一个完全有效的数组定义。
gcc
发出这些警告:
test.c:10:3:警告:初始化器周围缺少大括号 [-Wmissing-braces]
test.c:10:3: 警告:('a[0]' 的初始化接近)[-Wmissing-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
命名 p 的指针。(int *)
是演员表。所以你基本上是在投射(&a + 1)
到一个(int *)
.
但是,请注意,(&a + 1)
这与a[1]
.
&a
计算为数组的地址a
。将 1 加到数组的地址将增加 1 倍于数组包含的大小。在这种情况下,数组a
包含 5的数组int
,因此表达式的计算结果为int
距数组地址 5 的 int 的地址,或int
6
.
像这样定义你的数组:
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);