题外话之C++字符变量的地址的输出

        今天在看到《C++ primer plus》第四章程序清单4.17的时候产生了一个疑问,程序是这样的:

#include <iostream>
int main()
 {
    using namespace std;
     
    int nights=1001;
    int * pt=new int;
    *pt=1001;
     
    cout<<"nights value = "; 
    cout<<nights<<": location "<<&nights<<endl;
    cout<<"int ";
    cout<<"value = "<<*pt<<": location = "<<pt<<endl;
    double *pd = new double;
    *pd=10000001.0;
     
    cout<<"double " ;
    cout<<"value = "<<*pd<<": location = "<<pd<<endl;
    cout<<"location of pointer pd: "<<&pd<<endl;
     
    cout<<"size of pt = "<<sizeof(pt);
    cout<<": size of *pt"<<sizeof(*pt)<<endl;
    cout<<"size of pd"<<sizeof(pd);
    cout<<": size of *pd"<<sizeof(*pd)<<endl;
         
    return 0;
}

            运行结果:

题外话之C++字符变量的地址的输出

        其实程序本身并没什么难度,但是我突然产生了一个疑问,怎么所有变量和指针的地址只显示了3个字节?这是一个错误的问题,因为我以为int和指针变量有4个字节,所以地址应该是4个字节,这是错误的想法。这样显示的只是存储该变量的首地址而已,那应该如何显示全变量的地址呢?

        于是我百度了一下,发现有人问了同样的问题,不过是C语言的,程序如下:

#include<stdio.h>
int main()
 {
    int i=6;
    printf("i address is %x\n",&i);
    int j; 
    char *p = (char *)&i; 
    for (j=0;j<sizeof(i);j++)
    {
	 printf("i address: %x\n",p+j); 
    }
	return 0;
}

运行结果:

题外话之C++字符变量的地址的输出

        完美的解决办法,于是我想换成C++,像这样:

#include <iostream>
int main()
 {
	using namespace std;
	
	int i=6;
    cout<<"i address is "<<&i;
    cout<<endl;
    int j; 
	char *p = (char *)&i; 
	for (j=0;j<sizeof(i);j++)
	 {
	 	 cout<<"i address: "<<p+j<<endl; 
	 }
	return 0;
}

        结果得到了这样的结果:

题外话之C++字符变量的地址的输出

        毫无疑问,大吃一惊!!!赶紧百度一下,发现了这篇文章:

http://blog.csdn.net/sszgg2006/article/details/7982866

        解除了疑惑,赶紧测试了一下,像这样:

#include <iostream>
int main()
 {
	using namespace std;
	
	int i=6;
    cout<<"i address is "<<&i;
    cout<<endl;
    int j; 
	char *p = (char *)&i; 
	for (j=0;j<sizeof(i);j++)
	 {
	 	 cout<<"i address: "<<static_cast<void*>(p+j)<<endl; 
	 }
	return 0;
}

运行结果:

题外话之C++字符变量的地址的输出

        完美!!!

你可能感兴趣的:(题外话之C++字符变量的地址的输出)