我上一天参加了我的c ++课程,老师告诉我,引用必须引用有效的内存,而指针可能会或可能不会。我正在玩引用,突然出现了这个问题。当我声明一个大小为10的 array_demo 并将其值分配给10到19时,为什么程序正在编译,如果我在引用数组外的东西(索引11),我得到一个垃圾数字,这是不是有效的记忆!
#include <iostream>
using namespace std;
int main()
{
int array_demo[10];
int x= 10;
for(int i=0; i<10; i++)
{
array_demo[i]= x; //assigning values to array_demo
x++;
}
for(int j=0; j<10; j++)
{
cout<<array_demo[j]<<endl; //printing array values
}
cout<<endl;
cout<<endl;
int *p_x=array_demo;
int &ref_x= array_demo[11];
cout<< *(p_x+11)<< endl;
cout << ref_x << endl;
}
答案 0 :(得分:1)
引用必须在绑定时引用有效内存。然而,惩罚&#34;违反此规则的是undefined behaviour。编译器不必检测或通知您已破坏规则。
答案 1 :(得分:0)
这实际上并不是一个参考。数组是一个有趣的指针。
array_demo[11]
也可以表示为*(array_demo+11)
请参阅:http://www.cplusplus.com/doc/tutorial/pointers/#arrays
我不会错过指针算术。
答案 2 :(得分:0)
访问array_demo[11]
会导致未定义的行为;什么都可能发生。在那些属于&#34;任何东西&#34;表现得没有任何错误。
答案 3 :(得分:0)
看一些评论,这有点归结为不同的人试图在“有效”这个词中加入多少含义。
指针有一种无指向的方式:NULL。所以你可以说一个NULL指针指向一个“无效”的对象或变量。
但是引用无法引用任何内容。因此,除非您不遗余力地违反其他语言规则,即“有效”对象或变量。因此,在简单的对话中,很容易说“引用始终指向有效对象”,并且意味着与指针和NULL相比。
但是如果你确实违反了规则,那么你可以获得悬空引用或对内存的引用,这些引用通常不会发生。它可能仍然是“有效内存”,因为它存在于进程的地址空间内,但也不是任何“有效”对象或变量。
错误的引用是有效还是无效?这取决于你究竟想说的是什么......
如果你对这个词感到困惑,那就采用这种改写的方式:引用总是指某事。
还要记住,C ++没有很大的障碍来阻止你违反规则。您可以通过未定义的行为(例如访问超出数组边界)创建奇怪且看似不一致的情况。语言不会,在许多情况下不能阻止你做这些事情。开发人员必须确保您的逻辑正确和/或使用基于基础语言构建的机制来捕获无效情况(例如,vector::at)。