繁体   English   中英

C ++中的指针地址

[英]Pointer address in c++

对于这个问题的愚蠢行为,我事先表示歉意。 但是我找不到理解这种结果的方法。 我试图弄清楚C ++中的指针真正是什么。 以下只是一个简单的代码,以不同的方式打印地址。

int a = 15000;
char *b = reinterpret_cast<char*>(a); //equivalent of char *b = (char *)a
int *m = &a;

//(1)
printf("&a:%p\n",&a);           //0x7fff5fbff878
printf("&*m:%p\n",&*m);         //0x7fff5fbff878
printf("m:%p\n",m);             //0x7fff5fbff878

//(2)
printf("a:%p\n",(int*)a);       //0x3a98
printf("&*b:%p\n",&*b);         //0x3a98
printf("b:%p\n",b);             //0x3a98
printf("*m:%p\n",(int*)*m);     //0x3a98

printf("&b:%p\n",&b);           //0x7fff5fbff870

printf("&m:%p\n",&m);           //0x7fff5fbff868

//(3)
std::cout << "b:" << b << std::endl; //error: Segmentation fault: 11

所以问题是

  • 为什么(1)和(2)的地址不同
  • 为什么(1)和(2)的大小(地址长度)不同
  • 将int强制转换为char *时会发生什么
  • “ b”如何包含“ a”的地址
  • 为什么'printf(“ b:%p \\ n”,b)'工作时发生错误(3)。

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

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

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

将int强制转换为char *时会发生什么

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

为什么'printf(“ b:%p \\ n”,b)'工作时发生错误(3)。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM