tyl*_*d3n 5 c++ pointers reference
int main() {
int x=10;
int *p=&x;
int &y =*p;
cout<< x << endl << &x <<endl;
cout<< *p << endl << p <<endl;
cout<< y << endl << &y <<endl;
p++;
*p = 20;
cout<< x << endl << &x <<endl;
cout<< *p << endl << p <<endl;
cout<< y <<endl<< &y <<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以上是最能解释我的问题的代码.通常,变量引用(&)获取变量的地址并开始引用变量.我试过通过指针做同样的事情.我定义了一个变量,指针p指向x,引用变量y指向*p.这是否意味着y现在引用相同的变量x?下一步,我停止指向x到*p,现在引用变量y会发生什么?它会持有什么.在上面的代码中,cout <
有人可以帮助解释这里的行为.
[注意:这个答案只是关于C++.在C中,您的代码不应该编译.]
是的,初始化后y,它指的是x.增量p不会改变 - y仍然指的是x.
不幸的是,当你这样做时p++; *p=20;,你已经修改了p所以它不再引用任何分配的存储.当您写入它时,您会得到未定义的行为.这意味着该程序停止(或基本上做其他任何事情)是完全合理的.
但是请注意,递增p是完全允许的 - 在这方面,x行为类似于一个元素的数组,并且明确允许形成指向一个超过数组的最后一个元素的指针.只有当您写入指针指向的地址时,才会获得未定义的行为.(那是:p++;很好; *p=20;不是).
int &y =*p;
Run Code Online (Sandbox Code Playgroud)
在 C++ 中有效。但在 C 中,它是无效的,并且会给你编译时错误。
这是否意味着 y 现在引用同一个变量 x?
在 C++ 中,是的。但在递增时p,它不再指向变量x,而是指向某个未分配的内存位置。写入此位置会调用未定义的行为。现在任何事情都有可能发生。