C 中的取消运算符

Dereference operator in C++

本文关键字:运算符 取消      更新时间:2023-10-16

我无法围绕哪种类型的 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),则不能将指针类型转换为非销钉类型。否则课程应具有隐式转换操作员。假设intlong适合指针类型是错误的,并且有风险的假设。如果您承担这种风险,是的,您可以将指针存储到非销钉类型中:

int main()
{    
    int a, b;
    a = 10;
    b = (int)&a;
    a = 40;
    cout << *(int*)b << endl;
    *(reinterpret_cast<int*>(b)) = 160;
    cout << a << endl;
}