#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main() {
int a = 5;
int *b = &a;
cout << b;
}
这输出a
的地址,就像012FF86C
之类的,基本上这是一个字符串,对吧?
我看了一些关于指针的视频,人们说指针只是一个保存int值(内存地址)的变量,但是F
和C
呢?
不管怎样,这不是真正的问题。基本上,012FF86C
是一个字符串,那么为什么这样的东西不能工作呢?
string c = b;
我只是得到一个错误,如果我这样做,但为什么呢?
这就输出了一个类似于012FF86C之类的地址这是一个字符串,对吧?
不,它不是字符串。它是一个数字。以十六进制方式打印,内存地址通常是这样的。
指针保存一个内存地址,内存地址是数字。你打印的数字表示存储在指针中的地址。
但是f和c呢?
十六进制使用数字0-9和字母a-f。
无论如何,这不是真正的问题,基本上012FF86C是一个字符串,所以为什么不能像这样的工作?如果我这样做,我就会得到一个错误,但为什么呢?
因为b
是int*
,而不是字符串。
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