C 中的取消运算符
Dereference operator in C++
我无法围绕哪种类型的 value 接受尊重操作员接受作为其参数。通过 value ,我的意思是 lvalue 或 rvalue ?
考虑以下代码段:
int i = 1, *p = &i;
cout << *p++; // Prints 1, so far so good.
现在,由于Postfix ++
返回(与 p
返回增量对象的前缀对应物不同,上面的代码似乎是Unary *
接受rvalue rvalue作为唯一的操作数。但是,
cout << *i; // error: invalid type argument of unary ‘*’ (have ‘int’)
好吧,也许i
的值不代表有效的内存地址。现在,要确认Unary *
可以在代表有效内存位置的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
中存储的 value - 位置内存地址)到add
?或换句话说,是否有一种方法可以将存储地址存储在非销钉类型的变量中(如果不可能,我会感到惊讶,因为内存地址毕竟也是一个值)?
谢谢
内置的解除运算符采用一个prvalue,必须是指针类型。如果操作数是glvalue,则将在退出之前对其进行LVALUE转换。
如果要在数据指针类型和同等大小的积分类型之间转换,则可以说这是使用reinterpret_cast
要做的事情。这是为了防止错误,例如忘记取消指针到入口。
如果没有明确的铸件(reinterpret_cast
或C-Style cast),则不能将指针类型转换为非销钉类型。否则课程应具有隐式转换操作员。假设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;
}
相关文章:
- 取消引用运算符不能重载
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 使用 delete [] 运算符取消分配类中数据成员的内存
- 为什么在函数名称中使用取消引用" * "运算符?
- 取消引用临时对象上的运算符
- 当取消引用运算符 (*) 重载时,*this 的使用是否受到影响?
- 为什么 C++ 中指向方法取消引用运算符的指针具有如此低的优先级
- 为什么在取消引用的指向接口的指针上使用赋值运算符不是编译器错误
- 赋值不起作用,但带有取消引用运算符的地址起作用?
- 执行运算符在指针上无需取消就可以使用
- C++ *和运算符的取消引用地址?
- 取消引用适用于 ptr->运算符*(),但不适用于 *ptr
- 在自定义双链接列表中的自定义迭代器的取消运算符,找不到二进制操作员
- 在将函数分配给函数指针时,为什么可以多次使用取消任务运算符
- 如何重载箭头取消引用运算符->() 不是针对实体对象,而是针对指针
- C 中的取消运算符
- (取消)引用运算符的评估
- 重载取消引用运算符(运算符*())
- 使用重载的*运算符取消引用类
- c++重复箭头运算符取消引用性能与点运算符