这里定义了一个数组:
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]
你的数组是2x 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);