引用变量到指针

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 <

有人可以帮助解释这里的行为.

Jer*_*fin 7

[注意:这个答案只是关于C++.在C中,您的代码不应该编译.]

是的,初始化后y,它指的是x.增量p不会改变 - y仍然指的是x.

不幸的是,当你这样做时p++; *p=20;,你已经修改了p所以它不再引用任何分配的存储.当您写入它时,您会得到未定义的行为.这意味着该程序停止(或基本上做其他任何事情)是完全合理的.

但是请注意,递增p是完全允许的 - 在这方面,x行为类似于一个元素的数组,并且明确允许形成指向一个超过数组的最后一个元素的指针.只有当您写入指针指向的地址时,才会获得未定义的行为.(那是:p++;很好; *p=20;不是).


hac*_*cks 3

int &y =*p;
Run Code Online (Sandbox Code Playgroud)

在 C++ 中有效。但在 C 中,它是无效的,并且会给你编译时错误。

这是否意味着 y 现在引用同一个变量 x?

在 C++ 中,是的。但在递增时p,它不再指向变量x,而是指向某个未分配的内存位置。写入此位置会调用未定义的行为。现在任何事情都有可能发生。

  • 就目前而言,这个答案是不正确的。增加“p”使其指向未分配的内存具有标准中明确定义的行为。仅当您写入指针引用的位置时,才会发生未定义的行为。 (2认同)