C++ 中的指针地址

Pointer address in c++

本文关键字:地址 指针 C++      更新时间:2023-10-16

我提前为这个问题的愚蠢道歉。但我找不到理解这个结果的方法。我试图弄清楚指针在C++中到底是什么。以下只是以不同方式打印地址的简单代码。

int a = 15000;
char *b = reinterpret_cast<char*>(a); //equivalent of char *b = (char *)a
int *m = &a;
//(1)
printf("&a:%pn",&a);           //0x7fff5fbff878
printf("&*m:%pn",&*m);         //0x7fff5fbff878
printf("m:%pn",m);             //0x7fff5fbff878
//(2)
printf("a:%pn",(int*)a);       //0x3a98
printf("&*b:%pn",&*b);         //0x3a98
printf("b:%pn",b);             //0x3a98
printf("*m:%pn",(int*)*m);     //0x3a98
printf("&b:%pn",&b);           //0x7fff5fbff870
printf("&m:%pn",&m);           //0x7fff5fbff868
//(3)
std::cout << "b:" << b << std::endl; //error: Segmentation fault: 11

所以问题是

  • 为什么(1)和(2)的地址不同
  • 为什么 (1) 和 (2) 的大小(地址长度)不同
  • int 转换为字符时发生了什么*
  • "
  • b"如何包含"a"的地址
  • 为什么错误 (3) 在"printf("b:%p",b)"工作时发生。

为什么(1)和(2)的地址不同

因为在第一个示例 (1) 中,您使用了运算符的&地址,它为您提供了存储"a"变量的地址,示例 0x50302040

但是第二个示例 (2),您使用的是地址 ( 0x50302040 ) 指向的值,该值返回 15000,等于十六进制的 0x3a98。

int 转换为字符时发生了什么*

如果int的值为 15000,现在char*指向地址15000,这显然是错误的。

为什么错误 (3) 在"printf("b:%p",b)"工作时发生。

由于指针是char*指针,因此使用字符序列重载(ostream& operator<< (ostream& os, const char* s);,并且由于指针不指向字符序列(实际上,由于您为其分配了无效值,因此它不指向任何内容),因此程序崩溃。

有一个ostream& operator<< (void* val);重载只会打印指针的地址,但您需要将char*指针显式转换为void*指针才能使用它:

std::cout << "b:" << (void*)b << std::endl; // Prints 0x3a98 (15000)