Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 你能解引用一个整数文本吗?_C++_Pointers - Fatal编程技术网

C++ 你能解引用一个整数文本吗?

C++ 你能解引用一个整数文本吗?,c++,pointers,C++,Pointers,是否可以使用,例如: int x = *776 要从特定内存位置获取值?或者你一定要使用: int ref = 776; int x = *ref; int ref = 776; int x = *ref; 当然,内存地址可以由某些整数文本表示,例如 int* ptr = reinterpret_cast<int*>(776); 这是合法的。也是如此 int value = *reinterpret_cast<int*>(776); 您不能使用该代码,这完全是无

是否可以使用,例如:

int x = *776
要从特定内存位置获取值?或者你一定要使用:

int ref = 776;
int x = *ref;
int ref = 776;
int x = *ref;

当然,内存地址可以由某些整数文本表示,例如

int* ptr = reinterpret_cast<int*>(776);
这是合法的。也是如此

int value = *reinterpret_cast<int*>(776);
您不能使用该代码,这完全是无稽之谈,无法编译

你的意思可能是

int* ref = reinterpret_cast<int*>(776);
int x = *ref;
int*ref=重新解释铸造(776);
int x=*ref;
如上所述

int x = *reinterpret_cast<int*>(776);
intx=*重新解释铸造(776);

也是合法的。

当然,内存地址可以由某些整数文本表示,例如

int* ptr = reinterpret_cast<int*>(776);
这是合法的。也是如此

int value = *reinterpret_cast<int*>(776);
您不能使用该代码,这完全是无稽之谈,无法编译

你的意思可能是

int* ref = reinterpret_cast<int*>(776);
int x = *ref;
int*ref=重新解释铸造(776);
int x=*ref;
如上所述

int x = *reinterpret_cast<int*>(776);
intx=*重新解释铸造(776);

也是合法的。

简而言之,不。你不能说
intx=*776776
是一个整数文本,并被解释为
int
而不是
int*

较长的答案是,您(可能)不想这样做(明确取消引用特定内存地址的概念),因为(1)它不可移植,(2)使您的代码非常脆弱,(3)没有真正做到您希望它做的事情

有很多方法可以实现,但它们并不相互兼容。最基本的方法称为直接寻址。这是内存中每个位置都有一个地址的地方,当您说“转到位置0x308”时,它会转到物理内存中的那个单元。这可能非常危险,因为您可以访问操作系统或BIOS正在使用的内存区域。它还防止您(轻松地)在计算机上运行多个程序

间接访问内存的其他方法是相对(偏移)寻址和分段寻址。在您使用的地址和物理布局之间有一层保护层,可以防止您访问不应该访问的内存。一般来说,这就是为什么你会犯错误

如果您编写的代码访问特定位置的内存,操作系统可能会为您搞糟一切,或者您可能会损坏微控制器


虽然你可以做
intx=*((int*)776),您可能不想这样做,它很可能会出错。

简而言之,不。您不能说
intx=*776776
是一个整数文本,并被解释为
int
而不是
int*

较长的答案是,您(可能)不想这样做(明确取消引用特定内存地址的概念),因为(1)它不可移植,(2)使您的代码非常脆弱,(3)没有真正做到您希望它做的事情

有很多方法可以实现,但它们并不相互兼容。最基本的方法称为直接寻址。这是内存中每个位置都有一个地址的地方,当您说“转到位置0x308”时,它会转到物理内存中的那个单元。这可能非常危险,因为您可以访问操作系统或BIOS正在使用的内存区域。它还防止您(轻松地)在计算机上运行多个程序

间接访问内存的其他方法是相对(偏移)寻址和分段寻址。在您使用的地址和物理布局之间有一层保护层,可以防止您访问不应该访问的内存。一般来说,这就是为什么你会犯错误

如果您编写的代码访问特定位置的内存,操作系统可能会为您搞糟一切,或者您可能会损坏微控制器


虽然你可以做
intx=*((int*)776),您可能不想这样做,它很可能会出错。

intx=*((int*)776)
。恭喜你,你可能已经找到了最快的解决问题的方法之一!
776
是否寻址特定的内存地址?或者你的意思是什么?Gents:在x86、Linux和Windows之外还有一个世界-在微控制器上,这(第二个,如果你添加一些适当的强制转换)是一个有用的构造(假设内存位置存在并且对某人有意义)。而且:这是语言绝对允许的。第一个不是这样:在C中,除了NULL之外,没有其他方法来表示指针文字。@tofro第二个不起作用。编译器将不允许您取消对
int
的引用。一些铸件(见上文和πάνταῥεῖ 请注意,任何时候当您想要指向特定物理位置的内存时,您可能希望避免优化这些内存访问。因此,使用
(volatile int*)
,而不仅仅是
(int*)
intx=*((int*)776)
。恭喜你,你可能已经找到了最快的解决问题的方法之一!
776
是否寻址特定的内存地址?或者你的意思是什么?Gents:在x86、Linux和Windows之外还有一个世界-在微控制器上,这(第二个,如果你添加一些适当的强制转换)是一个有用的构造(假设内存位置存在并且对某人有意义)。而且:这是语言绝对允许的。第一个不是这样:在C中,除了NULL之外,没有其他方法来表示指针文字。@tofro第二个不起作用。编译器将不允许您取消对
int
的引用。一些铸件(见上文和πάνταῥεῖ 请注意,任何时候当您想要指向特定物理位置的内存时,您可能希望避免优化这些内存访问。因此,使用
(volatile int*)
,而不仅仅是
(int*)
“是合法的。”如果您对“合法”的定义包括“未定义的行为”,那么请确定。@Nicolas Casting并不意味着未定义的行为,只要您知道自己在做什么。你的洗衣机怎么样