C++ 将变量中的值作为指针地址取消引用

C++ 将变量中的值作为指针地址取消引用,c++,c,pointers,C++,C,Pointers,为什么只有指针可以取消引用。当我们有一个字符指针,比如说“p”,我们做一个“*p”操作,这意味着去获取存储在p中的地址位置的内容。最后,我们在这里要求的是通过将该值视为地址来获取“特定值”的内容 现在假设一个整数指针“p”在某些体系结构中占用8个字节。假设“p”保存整数变量“a”(int*p=&a)的地址。现在,如果我有一个大小为uint64_t的变量“x”,那么这个变量基本上可以保存8字节的数据。i、 例如,“memcpy(&x,&p,8)”,我正在将存储在“p”中的地址位置复制到“x”。在c

为什么只有指针可以取消引用。当我们有一个字符指针,比如说“p”,我们做一个“*p”操作,这意味着去获取存储在p中的地址位置的内容。最后,我们在这里要求的是通过将该值视为地址来获取“特定值”的内容


现在假设一个整数指针“p”在某些体系结构中占用8个字节。假设“p”保存整数变量“a”(int*p=&a)的地址。现在,如果我有一个大小为uint64_t的变量“x”,那么这个变量基本上可以保存8字节的数据。i、 例如,“memcpy(&x,&p,8)”,我正在将存储在“p”中的地址位置复制到“x”。在c编程中,我们可以使用“*p”来解引用指针,得到“a”的值。为什么我们不能像*((int *)x)那样做,得到“a”的值。< /p> ,因为C++不是汇编语言。在汇编中,您可以对寄存器执行任何操作—您可以“取消引用”它们(用作间接操作数)或乘法。奇普毫不在乎


C++作为一种高级语言,旨在帮助开发人员。如果你希望某个东西成为可撤销的地址,你可以这样键入,C++阻止你意外地做一些你不能用地址做的事情。这是一个很大的优势。

您可以执行
*(int*)x
,它将在内存位置
x
获取
int
。我不认为这在C标准中得到官方支持,但实际上,它通常适用于大多数实现

打字系统的一部分作用是防止你犯错误。通常,您不想取消引用
uint64\t
,因此,如果您这样做,可能是因为您犯了错误,编译器会为您指出错误


顺便说一下,
uintptr\u t
是一种与指针大小相同的无符号整数类型。如果您希望能够在另一个CPU体系结构上运行代码,请不要依赖于
uint64\u t
与指针大小相同。

请将代码格式化为代码。您可以执行
*(int*)x
,也就是说,让编译器假装该整数值是指针,从技术上讲,任何数字都可以用作指针。毕竟,指针实际上只是一个表示内存地址的数字。但您仍然必须告诉编译器将该数字视为指针,因为“2作为内存地址”和“2作为整数”本质上是不可区分的。它们都只是数字。重要的是使用它们的上下文,因为指针也有一个类型。从理论上讲,您可以取消引用任何您想要的内容,即使是解释为您的
uint64\u t
的8字节字符串,但它可能(而且很可能)会导致许多问题。我刚刚意识到,当x的类型为uint64\u t时,(int)x可以工作。但是,如果x是double类型,double还包含8个字节,则会出现编译错误,即“错误:无法将'double'类型的操作数转换为指针类型”
uintpttr\u t
非常重要。另外,C++比C更为安全,这是通过设计来实现的。