#include<iostream>
using namespace std;

int main()
{
int x = 1;
int* p_int = &x;
cout << &x << " " << p_int << endl;

char ch = '1';
char* p_char = &ch;
cout << &ch << " " << p_char << endl;

return 0;
}

输出如下:

006FF9FC 006FF9FC
1烫烫烫烫o 1烫烫烫烫o

  对于一个int类型,通过指向它的指针或直接&进行取地址,可以很轻松的输出其地址。但是对于char类型,输出的内容竟然是乱码,查阅资料发现:C++标准库中I/O类对输出操作符<<重载,在遇到字符型指针时会将其当做字符串名来处理,输出指针所指的字符串。
  由此对于上面这个问题有两种解决方案:
  (1)使用C的格式化输出

printf("%x\n", p_char);
printf("%x\n", &ch);

  (2)强制char *转换成void *

cout << static_cast<void*>(p_char) << endl;
cout << static_cast<void*>(&ch) << endl;

一块连续的内存,从低地址到高地址,输出的内存地址是其低地址。这块区域的内存保存的内容是一样的,区别就是我们以何种数据类型去解释它(从C的malloc就可以看出)。

int x = 1;
int* p = &x;
char* pp = (char*)p;
cout << p << endl;
cout << static_cast<void*>(p) << endl;

上述代码输出的地址相同,都是内存的低地址。