c ++中的指针地址

时间:2016-03-07 18:28:14

标签: 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 *
  • 时发生了什么
  • &#39; b&#39;可能包含&#39; a&#39;
  • 的地址
  • 为什么错误(3)发生在&#39; printf(&#34; b:%p \ n&#34;,b)&#39;正在努力。

1 个答案:

答案 0 :(得分: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);,因为你的指针没有指向一个字符序列(事实上) ,它没有指向任何东西,因为你为它分配了一个无效的值),你的程序崩溃了。

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

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