首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的解引用算子

C++中的解引用算子
EN

Stack Overflow用户
提问于 2016-06-15 10:37:55
回答 2查看 897关注 0票数 1

我无法理解尊重操作符接受哪种类型的值作为它的参数。在这里,我指的是价值还是价值?

考虑以下代码片段:

代码语言:javascript
复制
int i = 1, *p = &i;
cout << *p++; // Prints 1, so far so good.

现在,由于后缀++返回p的未增量值(与其前缀对应的值返回增量对象不同),因此从上面的代码中可以看出,一元*只接受一个rvalue作为它的唯一操作数。但,

代码语言:javascript
复制
cout << *i;  // error: invalid type argument of unary ‘*’ (have ‘int’)

好吧,也许i的值并不代表一个有效的内存地址。现在,为了确认一元*可以在表示有效内存位置的rvalue上工作,我尝试了如下所示:

代码语言:javascript
复制
unsigned long add = p;  // error: invalid conversion from ‘int*’ to ‘long unsigned int’ [-fpermissive]
cout << *add;           // error: invalid type argument of unary ‘*’ (have ‘int’)

这也使我想到我的下一个问题。假设unsigned long的大小是64位(对于我正在处理的系统来说正好是这样),为什么不能将存储在p中的值(恰好是64位内存地址)复制到add中呢?换句话说,是否有一种方法可以将内存地址存储在非指针类型的变量中(如果这是不可能的,因为内存地址毕竟也是一个值)?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2016-06-15 10:42:52

内置的去引用运算符接受一个prvalue,它必须是一个指针类型.如果操作数是一个glvalue,则在取消引用之前,它将受到从lvalue到rvalue的转换。

如果您想在数据指针类型和等效大小的整数类型之间进行转换,您可以这样做,但是您必须说这是您希望通过使用reinterpret_cast来实现的。这是为了防止错误,例如忘记取消指针到int的引用.

票数 3
EN

Stack Overflow用户

发布于 2016-06-15 11:02:31

如果没有显式强制转换(reinterpret_cast或C样式转换),则无法将指针类型转换为非指针类型。或者类应该有隐式转换运算符。假设intlong符合指针类型是错误的,也是有风险的假设。如果您承担此风险,可以将指针存储到非指针类型中:

代码语言:javascript
复制
int main()
{    
    int a, b;
    a = 10;
    b = (int)&a;

    a = 40;
    cout << *(int*)b << endl;

    *(reinterpret_cast<int*>(b)) = 160;
    cout << a << endl;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37833046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档