合法是不许的。可以用黑技术改变,或用嵌入两条汇编指令实现。
int x=5; int &p=x; int y=6;
c++中的静态“应用”变量p初始必须指向一个单元x,这个应用单元p就指向x,p自已无法被访问,所有的操作将是所指向的单元x。其实这应用单元p是存在的,你用c++无法改变而已,你可以用黑办法改变p的指向。
int x=5; int &p=x; int y=6; // p为值5
(int *)(&y)[1]=&y; // 黑办法, 在栈中p单元应在y单元后面1个4字节word。 我用c++builder6.0试的
// 显示 p值,已变成了6,说明改指向了y.
“应用”的真正作用为是函数的传址调用,而不是静态使用。这时指针的作用要强过“应用”了。
如果要问为什么“应用”自已没有指针? 这要涉及它的目的,是为了函数的传址调用,必须访问实参,而不许访问形参。编译器阻止了对“应用”单元本身的访问。
C++之前的语言有的是可以这样做的,但是C++的创始人认为这样做会导致语法很奇怪,因此就没有支持。有时候制造一个新的作用域可以达到这样的效果,例如
int main(){
int b,c;
int &a=b;
{
int &a=c;
}
}
这样是可以达到这个效果的,虽然实质上是定义了一个新的同名变量……
不也以
使用引用时必须注意
(一)声明一个引用时,必须同时对他进行初始化,试图指向一个已存在的对象
(二)一旦一个引用被初始化后,就不能改为指向其他对象
---摘自c++程序设计 郑莉 第3版77页