数组指针和数组首地址

来源:互联网 发布:淘宝上有没有猛将气 编辑:程序博客网 时间:2024/06/04 20:09

下面代码会输出什么()

1
2
3
4
5
6
int main(int argc, char **argv)
{
    inta[4] = {1,2, 3,4};
    int*ptr = (int *)(&a + 1);
    printf("%d", *(ptr -1));
}

答案 4

解析:

这边主要考察的是数组指针和数组首地址的问题。
&a是数组指针,a是数组首地址。
而指针的+1,增加的是1个指针类型的长度。比如&a是数组指针,(&a + 1)增加的是1数组的长度
所以题目中第四步的ptr指向的是a[4]的位置。
(ptr - 1)减少的是1个数据元素的长度。第五步ptr指向的是a[3],页就是4

解析:

其实测试可以发现,a 和 &a 是同一个地址,printf("%d",a),printf("%d", &a)结果是相同的。
但是其代表的含义不同,*(a+1)代表从a数组首地址跳跃一个int的长度,*(&a+1)表示从a数组首地址跳跃一个数组的长度,也就是指向a数组最后一个元素的下一个位置,因此*(ptr- 1)表示a数组的最后一个元素。



原创粉丝点击