文档章节

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

竖子小子傻子
 竖子小子傻子
发布于 2015/05/04 16:45
字数 487
阅读 21
收藏 0

        今天在看到《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;
}

            运行结果:

        其实程序本身并没什么难度,但是我突然产生了一个疑问,怎么所有变量和指针的地址只显示了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++,像这样:

#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;
}

        结果得到了这样的结果:

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

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;
}

运行结果:

        完美!!!

© 著作权归作者所有

竖子小子傻子
粉丝 0
博文 8
码字总数 10039
作品 0
广州
私信 提问
跟我一起学习C++虚函数--第四篇

在前一篇,我们讨论了在多继承情况下,具有虚函数的类的内存布局情况。本篇将进一步探索在多重继承,即具有重复继承的情况下的内存布局情况。在阅读本篇和下一篇之前,建议先阅读本博客另一篇...

pathenon
2012/07/15
218
4
计算机专业C语言编程学习重点:指针化难为易

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/05/31
0
0
旅行,说走就走 Help? [C++数据类型和表达式]

旅行,说走就走 Help? [C++数据类型和表达式] 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 乐天派。我却喜欢和老妈说“老妈小时候喜欢羡慕...

泥沙砖瓦浆木匠
2014/08/29
93
0
C语言编程学习程序解析:数据类型和函数返回值解析

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/05/27
0
0
C#调用C的Dll(类型对照)

C#调用C的DLL //C++中的DLL函数原型为 //extern "C" declspec(dllexport) bool 方法名一(const char 变量名1, unsigned char 变量名2) //extern "C" declspec(dllexport) bool 方法名二(cons......

KavenSu
2014/04/30
3.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部