开发者社区> 问答> 正文

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

源文件如下:

#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 ^_^

展开
收起
a123456678 2016-06-13 10:38:44 1941 0
1 条回答
写回答
取消 提交回答
  • a[]是一个包含5个元素的数组,a是指向该数组的首指针。而&a则是一个包含5个元素的数组的指针,所以&a的类型应该是 int ()[5],此时,你对&a做加一操作。指向的地址实际是a+5sizeof(int),此时实际已经是非法地址了,但是碰巧的是cout的时候,( (ptr -1)) 又将改指针做了减一操作,由于ptr是int ,该操作指向了合法地址,也就是数组的最后一个元素,所以输出了5.

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

    2019-07-17 19:35:15
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载