C++ c+中的指针地址+;
我为这个问题的愚蠢事先道歉。但是我找不到理解这个结果的方法。我想弄清楚指针在C++中的真正含义。下面是一个简单的代码,用不同的方式打印地址C++ c+中的指针地址+;,c++,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 prin
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
inta=15000;
char*b=重新解释(a)//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)
标准::cout
为什么(1)和(2)的地址不同
因为在第一个示例(1)中,您使用运算符的&
地址,它为您提供存储“a”变量的地址,例如0x50302040
但在第二个示例(2)中,您使用的是地址(0x50302040
)所指向的值,该值返回15000,十六进制时等于0x3a98
将int转换为char时发生了什么*
如果int
的值为15000,现在char*
指向地址15000
,这显然是错误的
为什么在“printf(“b:%p\n,b)”工作时发生错误(3)
因为您的指针是char*
指针,因此字符序列重载(ostream&operatorHint:0x3a98==15000)。在案例(2)中,int被转换为指针。这是合法的,但不保证在任意上下文中有意义。在案例(3)中你试图使用这个伪指针,好像它指向字符数组(C字符串)-但它没有。该死,非常感谢你没有责怪:(1)和(2)的长度没有区别,只是没有打印前导零。谢谢。(3)怎么样?为什么不打印15000?
std::cout << "b:" << (void*)b << std::endl; // Prints 0x3a98 (15000)