开发者社区> 问答> 正文

求高手指点取址运算符&问题

a123456678 2016-06-13 10:38:44 888

源文件如下:

#include<iostream>
using namespace std;
int main(void){

int a[] = {1,2,3,4,5};
 int *ptr = (int *) (&a +1);  // 此处使用了取址运算符&,似乎之后便发生了

                                      //一些不可思议的事情
 cout << "*(a+1) = " << *(a+1) <<", ( *(ptr -1)) = "<<( *(ptr -1)) << endl; 

//经g++编译运行成功显示出结果2和5.证明ptr指针发生了对a数组块的跳转,

//请原谅我的知识短浅,我确实搞了一晚上还是不明白其所以然啊!!!!
}

//希望大侠们不吝赐教a ^_^

分享到
取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:35:15

    a[]是一个包含5个元素的数组,a是指向该数组的首指针。而&a则是一个包含5个元素的数组的指针,所以&a的类型应该是 int ()[5],此时,你对&a做加一操作。指向的地址实际是a+5sizeof(int),此时实际已经是非法地址了,但是碰巧的是cout的时候,( (ptr -1)) 又将改指针做了减一操作,由于ptr是int ,该操作指向了合法地址,也就是数组的最后一个元素,所以输出了5.

    由此可以说明,显示强制转换有时候是多么的粗鲁。当然,&(a +1)这个操作也是不合法的。因为C++11未实现之前,右值引用是不合法的。

    0 0
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

推荐文章