一个正常的变量可以保存内存地址的一些其他变量在c++ ?


#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main() {
int a = 5;
int *b = &a;
cout << b;
}

这输出a的地址,就像012FF86C之类的,基本上这是一个字符串,对吧?

我看了一些关于指针的视频,人们说指针只是一个保存int值(内存地址)的变量,但是FC呢?

不管怎样,这不是真正的问题。基本上,012FF86C是一个字符串,那么为什么这样的东西不能工作呢?

string c = b; 

我只是得到一个错误,如果我这样做,但为什么呢?

这就输出了一个类似于012FF86C之类的地址这是一个字符串,对吧?

不,它不是字符串。它是一个数字。以十六进制方式打印,内存地址通常是这样的。

指针保存一个内存地址,内存地址是数字。你打印的数字表示存储在指针中的地址。

但是f和c呢?

十六进制使用数字0-9和字母a-f。

无论如何,这不是真正的问题,基本上012FF86C是一个字符串,所以为什么不能像这样的工作?如果我这样做,我就会得到一个错误,但为什么呢?

因为bint*,而不是字符串。

b不是字符串,而是指向int型的指针,所以不能对它们赋值。变量在c++中是严格类型的。但是,您可以使用如下的转换函数:

string c = to_string(*b); // IDK, if just plain b will work, never tested

你已经有了#include <string>using namespace std;


有人评论说你想要地址…

可以这样做:

template <class T>
string to_string(T* p)
{
return to_string((uintptr_t) p); // on visual c++, probably UINT_PTR instead of uintptr_t
}

,然后在main

string c = to_string(b);

但这不是十六进制的…

看似最简单的一行是:

cout << std::hex << (uintptr_t) b << endl;

嗯,人们已经指出地址实际上是一个数字而不是字符串。但是,如果你仍然对标题中的问题感到疑惑,"正常变量可以保存c++中其他变量的内存地址吗?",我希望能给出一个答案,因为似乎还没有人谈论过这个问题。现在大多数现代操作系统都是64位的,所以我假设您也在使用64位的操作系统。在64位操作系统中,内存地址存储为无符号64位整数或c++

std::uint64_t / unsigned long.

因此,您可以reinterpret_cast/C风格将任何指针强制转换为无符号64位整数,并将其地址存储在一个正常的整数中。

float x = 8.9f;
std::uint64_t ptr = reinterpret_cast<std::uint64_t>(&x);

如果想将地址用作指针,则需要再次将其重新interpret_cast转换为适当的指针类型。用字节来做指针运算可能比用char*更有用。

012FF86C是十六进制表示的b的值
b是一个指针保存a的地址
,你不能

string c = b; // unless b is of type string

但是你可以

string c = "b"; 

int a = 0x012FCB59;  // hex representation

相关内容

  • 没有找到相关文章

最新更新