[英]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)中,您使用&
运算符的&
地址,它为您提供了存储“ 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.