C++-C++中数组的元素好像不能是引用类型?
C++中数组的元素好像不能是引用类型,为什么呢?好像编译程序将引用变量编译为指针变量,而指针变量的值就是被引用的变量的存储地址。如果真是这样,那为什么数组元素不能是引用变量?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
C++中数组的元素好像不能是引用类型,为什么呢?好像编译程序将引用变量编译为指针变量,而指针变量的值就是被引用的变量的存储地址。如果真是这样,那为什么数组元素不能是引用变量?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
你说的这个情况不存在,是不是你的代码写错了,下面是我写的测试代码,可以编译通过
int a;
int *b[1];
b[0]=&a;
引用是没有空引用这个概念的,否则他跟指针的概念就重叠了。也就是说引用的对象一定存在,假如c++容器可以存放引用,那就会变成非常不稳定不安全的语言,你无法确保你引用的对象是否存在(可能被堆栈清理了),程序执行变得不稳定。跟其他在虚拟机(如java,dot net)的语言不同,他们是将对象生命周期都交给运行环境来管理(gc机制),这样就可以将引用放到容器。
这是编译器一种自我保护的方法吧。因为数组的存储空间是在编译的阶段就确认的,比如,int a[8];编译阶段,在栈中就会申请32字节的内存。但是,紧跟着32个字节之后的内存,存的可能是调用函数的基指针,参数信息等等。如果引用这么用的话,可能会是堆上的空间引用了这个地址,很容易造成空间管理的混乱,生存期的管理等等等等一系列很蛋疼的问题。。
当然不可以。如果可以是引用的话,首先引用是没有空引用这个概念的,所以你一定的给它赋值。但即使你给他初始化了,例如
int i = 3;
int j = 4;
int &a[] = {i,j};
数组的内存空间是连续存储的,数组的实现方式其实就是指针。数组名就是数组的首地址,后面都是通过指针运算来取得数组里的每一个值的。即我们可以通过指针计算来找到数组指向的值。
a[1] 是等同于(a + 1);
假设i的地址是 0x20ff44; j的地址是 0x30ff44;
如果&a[0] 即数组a的首地址是 i的地址0x20ff44。
那么a+1将是 0x20ff48。那么(a+1)的值并不是j的值啊。这不错乱了。除非你保证,i,j的地址是连续的。这谁知道呢。所以编译器这么做,是在减少程序员的麻烦。
但声明一个引用指针是可以的,如下。
int ival = 1;
int *pi = &ival;
int *&pi2 = pi;
const int ival = 1024;
const int * const &pi_ref = &ival;