Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的指针地址+;_C++ - Fatal编程技术网

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

我为这个问题的愚蠢事先道歉。但是我找不到理解这个结果的方法。我想弄清楚指针在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
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)