首页 C++指针存储结构

C++指针存储结构

举报
开通vip

C++指针存储结构nullC++指针存储结构王华杰 http://www.basilwang.net 2010-09-16C++指针存储结构C++指针存储结构C++指针存储结构概述 线性排序 二进制存放 数据类型和编码 变量和指针 引用 数组 动态存储分配 函数参数传递在内存中的表示 概述概述c++的学习中,对指针的理解和把握相当重要,可能很多同学对此感到困惑。我个人感觉指针的理解实际上还是依赖于对内存存储的理解,因此了解内存的存储机制就显得至关重要。 当然由于内存的存储机制实际上比较复杂,而且我们的任务是学习程序的编写,所以我这里...

C++指针存储结构
nullC++指针存储结构王华杰 http://www.basilwang.net 2010-09-16C++指针存储结构C++指针存储结构C++指针存储结构概述 线性排序 二进制存放 数据类型和编码 变量和指针 引用 数组 动态存储分配 函数参数传递在内存中的表示 概述概述c++的学习中,对指针的理解和把握相当重要,可能很多同学对此感到困惑。我个人感觉指针的理解实际上还是依赖于对内存存储的理解,因此了解内存的存储机制就显得至关重要。 当然由于内存的存储机制实际上比较复杂,而且我们的任务是学习程序的编写,所以我这里更多是从程序的角度来看内存的存储(有一定程度的简化)。但当我们了解了内存存储的方式,知道程序中的常量、变量、指针在内存中的表示,又能够进一步指导我们程序的书写。 线性排序线性排序首先请把内存想象成一段连续的格子,每个格子可以存储 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 (如果一个格子装不下,可能放到多个格子中,这种情况很普遍) 注意两点 1 格子是有序排列的,也就是每个格子都有编号,从小到大排列。我们也常说内存是线性空间排列的(就是想象成一条线) 2. 每个格子大小是1个字节(Byte 简写B) 1Byte=8bit 二进制存放二进制存放接下来我们看看1个字节都可以存放哪些内容 我们要时刻牢记内存存储的实际上只是0和1,那么就假设我们的计算机只能处理二进制数(二进制计算器?)。看看1个字节可以表示多少个数 二进制存放二进制存放上图,我们把一个字节分成8比特展开,上图表示的二进制数为 00000001,转换为十进制数为1,那么我们用一个字节最多可以表示从00000000—11111111共256个数(十进制从0到255)。 好,现在我提一个问题,如果我想表示十进制的258怎么办,因为258的二进制数为100000010,我们用一个字节无法完全容纳。我们可能想用计算机表示一个比较大的数,比如十进制数1340054788(2009年1月我国人口数) ,如果用二进制数表示是0100 1111 1101 1111 1001 1101 0000 0100二进制存放二进制存放0100 1111 1101 1111 1001 1101 0000 0100 二进制存放二进制存放可以看到我们需要4个字节来表示,可是计算机怎么知道它的这四个字节是表示1个数(13亿)还是4个数(1个字节1个数)亦或是3个数? 所以这里引出了数据类型的概念。 数据类型和编码数据类型和编码上节计算机无法确定具体的表示内容的原因是我们对不同大小内容的存放没有确切的限制,类比前面的格子,有的内容用一个格子,有的内容用两个格子,还有的用四个格子。所以必须对内容的存放做限制,比如不管多大的数统一用4个字节存放(实际上就是32位window系统整形int的长度) 如图是十进制的1 数据类型和编码数据类型和编码如图是十进制的4294967296 (4.2亿) 也就是说我们可以表示0~4.2亿的数,虽然这样对于小的数有空间浪费(比如十进制的1,浪费了3个字节)、对更大的数无法表示(比如5.6亿,会溢出),但是我们界定了内容的宽度,使得存储变得简单。 数据类型和编码数据类型和编码我们常用的整形,就是用四个字节表示,由此我们已可以推断它的取值范围(0~4.2亿,我们这里没有讨论负数,有所简化,但原理一样)。 也就是说,当我们写 int a=3; 实际上在内存中占据了4个字节,如下图 数据类型和编码数据类型和编码那么字符是怎么显示的呢 先来看一下英文字母及标点符号的表示。由于内存只能表示0、1,我们不得不采用一些办法才能存储字符。我们通常采用字符集(Character Set)的方式,即在计算机中存储时也要使用二进制数来表示,但具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫字符集,注意和编码不同)。 比如十进制的65 代表A 数据类型和编码数据类型和编码那么字符码就有26个小写字母、26个大写字母、10个数字、32个符号、33个句柄和一个空格,另外加上一些扩展字符,总共是256个字符码。同整数一样,我们也需要对字符所占的宽度进行约束(要不同样无法辨别) 我们可以根据 公式 小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载 Y=Log2 X得出Y即为所占宽度,所以256字符需要每个字符占1个字节的宽度。 比如 char a=’3’; char b=’A’; 这也就是我们常说的ASCII字符集(Single-Byte Character Set,简称SBCS),类似的SBCS还有阿拉伯语ISO8859-6 等等。 数据类型和编码数据类型和编码至于简体中文、繁体中文、日文和韩文,显然用1个字节存储是不够的,所以采用了双字节字符集的形式(Double-Byte Character Set,简称DBCS),属于DBCS的有简体中文的GB2312,繁体中文的BIG5。 标准化协会还另外采用了2个字节的宽度来表示所有的字符的字符集形式即Unicode(宽字节字符集),旨在把全世界的文字用一种字符集(Character Set)表示。目前已经定义了包含英文(一个英文字母也占两个字节)、中文、日文、阿拉伯字母等大约35000个代码点,而实际上2个字节的宽度可以表示65536个代码点。 变量和指针变量和指针我们了解了数据类型,来看一看变量的声明和使用,以整形为例 int n; 则会在内存中的某一个位置选取4个字节存放该整形,然后计算机 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 下该内存的地址(那么内存的地址如何表示?),由于声明并没有赋值,所以只是分配了内存空间并没有赋初值。 这种方式分配空间和动态分配空间(C里用malloc,C++用new)是不同的,静态方式会在该变量n超过其变量作用范围时自动释放(回收),而动态方式需要我们用(C利用free,C++用delete)回收。 变量和指针变量和指针如图 这里n可以看作是别名,我们的编译器在编译程序的时候做了一些手脚,把n和该段内存的地址建立了关联,这样后面我们可以利用n来方便的更改该段内存的内容,而实际上计算机内部处理还是按照地址去访问的。比如 n=30; 变量和指针变量和指针现在来了解一下地址(实际上也是我们在线性排序中提到的格子的编号),因为该编号最终也是会以二进制的形式存储,所以我们也给它规定了一个数据类型,并且限定了它的宽度,这就是指针类型,宽度为4个字节也就是常说的32位(在32位windows系统,比如xp)。 那么当我们一个格子代表一个字节而给它们进行地址编号(也就是指针)的话,最多可以表示2的32次方 4294967296个字节,实际上就是4GB。这也说明32windows系统的寻址空间最多就是4GB,window xp 最大支持的物理内存是4GB。 那么如下代码int *p; 是否像整形变量n一样需要在内存分配空间?分配多大的空间呢?它里面又存放什么内容呢?变量和指针变量和指针要回答上面的问题,我们首先来看一下指针的声明 int *p; char *x; double *y; 上面分别声明了指向int的指针、指向char的指针、指向double的指针,它们没有本质的不同,都是占4个字节,在计算机内部处理方式是完全一样的,不同的只是编译器在编译时要检查指向int的指针必须指向int(有点啰嗦),而不能其他 。所以应该把指针理解成一个二进制数(0到4.2亿)。 变量和指针变量和指针再看指针的存储 int *p 声明了这样一个指针,并且像整形一样在内存里分配了四个字节的空间 只不过这个指针变量没有任何内容,换句话说,没有指向任何的int变量。 变量和指针变量和指针int n=3; int *p; p=&n; 其中&是取地址操作符,意思是取变量n在内存中的地址并且放到p分配的空间存放,假设是十进制的2293532,那么二进制是0000 0000 0010 0010 1111 1111 0001 1100,则p中存放的值如下图 变量和指针变量和指针提到&就不能不提* ,*是解引用操作符,那么什么时候用*呢,看一看前面定义的指针p,它里面存放的是n变量的地址,可是我们对这个二进制数不感兴趣,很多时候我们需要了解p的值(某地址)究竟存放什么样的内容?这时候就用到了* cout <<*p< 本文档为【C++指针存储结构】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_353071
暂无简介~
格式:ppt
大小:2MB
软件:PowerPoint
页数:0
分类:互联网
上传时间:2012-08-10
浏览量:24