加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 理解引用与指针.为什么这样做?

发布时间:2020-12-16 05:40:07 所属栏目:百科 来源:网络整理
导读:从今天的 series of SO questions开始,我对指针,引用和值的真实性质了解甚少. 请考虑以下代码: int* p = new int(3);int r = *p;cout " p = " p "t*p = " *p endl;cout "r = " r "t r = " r endl;delete p;cout "r = " r "t r = " r endl;int v = 4;r =
从今天的 series of SO questions开始,我对指针,引用和值的真实性质了解甚少.

请考虑以下代码:

int* p = new int(3);
int& r = *p;

cout << " p = " << p << "t*p = " << *p << endl;
cout << "&r = " << &r << "t r = " << r << endl;

delete p;

cout << "&r = " << &r << "t r = " << r << endl;

int v = 4;
r = v;

cout << "&r = " << &r << "t r = " << r << endl;

这个输出是

p = 0x1001000b0    *p = 3
&r = 0x1001000b0     r = 3
&r = 0x1001000b0     r = 3
&r = 0x1001000b0     r = 4

我不明白的是为什么我第二次打印引用的值时我没有收到错误.与参考值对应的指针已被删除.从我的previous question开始,我几乎已经说服自己,任何语句如r = x都会在r所指的值的位置生成x的副本.但是,如果是这种情况,则p和& r将是不同的地址,对吗?如果我已经在0x100100b0上调用了delete,那么我该如何继续使用它呢?

对或错:引用与地址值的别名相同.

正确或错误:如果删除指向与引用值相同的地址的指针(如上所述),则不会发生任何未定义的行为,只要引用存在,就不会覆盖该地址.

解决方法

即使您没有收到错误,结果仍然是未定义的.未定义的行为意味着任何事情都可能发生,包括您的程序似乎继续正常工作.

A reference is the same thing as an alias to the value at an address.

这实际上是正确的.说引用是对象的别名(而不是值)会更正确.

If you delete a pointer to the same address as a referenced value resides,(as I do above),then no undefined behavior will occur,

这也是事实.在尝试使用引用之前,没有已定义的行为.当您尝试使用引用(例如,通过& r)时,您将获得未定义的行为.

如果在销毁对象后从未尝试使用引用,则没有未定义的行为.

no one will ever overwrite that address as long as the reference exists.

不,这不正确.一旦对象被销毁,任何引用或指针都无效且无法使用.如果尝试使用指针或对已销毁对象的引用,则结果是未定义的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读