源文件如下:
#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 ^_^
a[]是一个包含5个元素的数组,a是指向该数组的首指针。而&a则是一个包含5个元素的数组的指针,所以&a的类型应该是 int ()[5],此时,你对&a做加一操作。指向的地址实际是a+5sizeof(int),此时实际已经是非法地址了,但是碰巧的是cout的时候,( (ptr -1)) 又将改指针做了减一操作,由于ptr是int ,该操作指向了合法地址,也就是数组的最后一个元素,所以输出了5.
由此可以说明,显示强制转换有时候是多么的粗鲁。当然,&(a +1)这个操作也是不合法的。因为C++11未实现之前,右值引用是不合法的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。