我无法理解尊重操作符接受哪种类型的值作为它的参数。在这里,我指的是价值还是价值?
考虑以下代码片段:
int i = 1, *p = &i;
cout << *p++; // Prints 1, so far so good.现在,由于后缀++返回p的未增量值(与其前缀对应的值返回增量对象不同),因此从上面的代码中可以看出,一元*只接受一个rvalue作为它的唯一操作数。但,
cout << *i; // error: invalid type argument of unary ‘*’ (have ‘int’)好吧,也许i的值并不代表一个有效的内存地址。现在,为了确认一元*可以在表示有效内存位置的rvalue上工作,我尝试了如下所示:
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中呢?换句话说,是否有一种方法可以将内存地址存储在非指针类型的变量中(如果这是不可能的,因为内存地址毕竟也是一个值)?
谢谢
发布于 2016-06-15 10:42:52
内置的去引用运算符接受一个prvalue,它必须是一个指针类型.如果操作数是一个glvalue,则在取消引用之前,它将受到从lvalue到rvalue的转换。
如果您想在数据指针类型和等效大小的整数类型之间进行转换,您可以这样做,但是您必须说这是您希望通过使用reinterpret_cast来实现的。这是为了防止错误,例如忘记取消指针到int的引用.
发布于 2016-06-15 11:02:31
如果没有显式强制转换(reinterpret_cast或C样式转换),则无法将指针类型转换为非指针类型。或者类应该有隐式转换运算符。假设int或long符合指针类型是错误的,也是有风险的假设。如果您承担此风险,可以将指针存储到非指针类型中:
int main()
{
int a, b;
a = 10;
b = (int)&a;
a = 40;
cout << *(int*)b << endl;
*(reinterpret_cast<int*>(b)) = 160;
cout << a << endl;
}https://stackoverflow.com/questions/37833046
复制相似问题