【发布时间】:2016-10-16 10:15:42
【问题描述】:
我无法理解尊重运算符接受哪种类型的 value 作为其参数。 value,这里的意思是lvalue还是rvalue?
考虑以下代码sn-p:
int i = 1, *p = &i;
cout << *p++; // Prints 1, so far so good.
现在,由于后缀 ++ 返回 p 的 未增量值(与返回 增量对象 的前缀对应物不同),从上面的代码看来,一元* 接受右值作为其唯一的操作数。但是,
cout << *i; // error: invalid type argument of unary ‘*’ (have ‘int’)
好的,i 的值可能不代表有效的内存地址。现在为了确认一元 * 可以处理代表有效内存位置的右值,我尝试了这样的事情:
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 中的 value (发生这种情况是一个 64 位内存地址)到add?或者换句话说,有没有办法将内存地址存储在非指针类型的变量中(如果这是不可能的,我会感到惊讶,因为内存地址毕竟也是一个值)?
谢谢
【问题讨论】:
-
*只能用于指针。您的代码*i和*add失败,因为i和add是整数,而不是指针;与价值类别无关 -
别再考虑位数了。
int和double可能都是 123 位长,但类型不同。int和unsigned int可能各为 62 位,但类型不同。指针和整数是不同的类型,即使它们的位数可能相同。在绝大多数情况下,您不需要将指针转换为整数,反之亦然;这是一种可怕的代码气味。
标签: c++ pointers dereference