-3

这里定义了一个数组:

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意思。

4

3 回答 3

2

首先要注意,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].

于 2013-08-06T07:25:16.883 回答
0

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

于 2013-08-07T02:25:34.090 回答
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);
于 2013-08-06T07:43:47.867 回答