- 1
- 0
- 约9.78千字
- 约 6页
- 2018-02-26 发布于江苏
- 举报
【计算机】3.2 指针类型与地址算法
3.2 指针类型与地址算法
3.2.1 指针的概念与定义
在对变量进行定义时,编译器都为其分配一块内存单元,该内存单元中存放该变量的值,而该内存单元还具有确定的地址,通过该地址可以实现对该内存单元的访问。指针便是存放一个对象在内存中的地址的。指针是非常有用。通过指针,可以直接对内存中各个不同数据类型的数据进行快速地处理,并为函数之间各类数据传递提供了简捷便利的途径。通过指针可以方便地创建链表和管理动态对象等。正确熟练地使用指针能够编写出简洁有效、功能强大的高质量程序。但是指针的使用比较复杂,易留下一些不易察觉的隐患,最终导致程序的瘫痪。
指针变量是用来存放内存地址的,其内容是内存中的一个地址。通过指针可以实现对内存中相应变量和函数等的访问。每一个指针都有一个相应的类型,该类型是说明指针所指向的内存单元中所存放的数据为数据类型。但是,不同类型的指针在内存中占用的空间大小都是相同的,即指针本身不确定其占用内存区域的大小及数据存放规律。指针的类型告诉编译器在编译指针所指向对象的二进制序列按什么规律进行翻译并翻译多少位。
先介绍两个与指针运算有关的运算符。运算符“*”称为取值运算符,它的作用是访问地址的内存单元,“*指针变量名”是对该内存单元中的数据进行访问;运算符“&”称为取址运算符,“&变量名”是取得某变量的地址。取值运算“*”和取地址运算“&”是一对互逆运算。
定义指针变量的语法结构如下:
type *varible1,*varible2,….,*variblen;
其中type是指针的类型,即该指针变量所指向的内存单元中所存储的数据为数据类型。而存储类型则是指针型变量自身的存储类型。定义语句中变量名前加“*”号,表明该变量被定义为指针变量,要注意此处的“*”号和执行语句中的“*指针名”之间的区别。
注意:在一个定义语句中同时对若干个指针变量进行定义时,在用逗号分隔的定义表中,每个指针变量前都必须加上取值运算符“*”。
在对指针变量进行读取操作之前必须对它进行初始化。一个指针可以被一个具有相同类型的对象进行初始化,这个相同类型的对象可以是一个同类指针变量,也可以对相应类型的变量用取址操作符获得其地址。例如:
int val=512;
int *pt1=val;
int *pt2=pt1;
C++是一种具有强类型检查机制的语言,所有在初始和赋值中出现的数据都将在编译时受到检查,看它们是否与所需的类型正确匹配。如果不匹配但满足某一转换规则,则编译器会按照这一规则自动进行类型转换;否则是十分不安全的,它将导致一个编译错误。最好不要依赖编译系统的自动转换,而由程序员用显示地强制类型转换来完成指针类型之间的转换。
强制类型转换的形式为
(目标类型 *)变量名
例如:
int var1=10
char *str;
int *var=var1;
str=(char *)var;//error
一个指针可以赋零值(NULL),表明该指针不指向任何一个对象,称为空指针。
C++中还提供了一种通用的指针类型void *,它将使指针有能力指向任何类型的对象。
3.2.2 指针变量的运算规则
指针的运算是按指针所持有的地址变量所进行的,其运算的实质是地址的计算。它只包括一部分的算术运算、关系运算和赋值运算。
1、指针的算术运算
指针的算术运算只有两种加法和减法(地址值加减)。而指针的加减算术运算也仅支持指针变量与整数相加或用一个指针变量减去一个整数的运算,不允许将两个指针相加,也不允许将浮点数或双精度数等与指针相加减。
假设pt是一个指针变量,指针中保存的内存地址为d,它所指向的数据的数据类型在内存中占用的字节数为n,则算术运算:pt±m的结果值为d±m*n地址值。
例如:若pt是一个指向整型变量的指针,其保存的地址值是2000,而整型数据在内存中所占用的内存单元为2=n,若在算术运算中取m=5,则pt+5获得的地址值为2010,而不是2005。
值得注意的是,在8088/8086系列微机上进行指针的算术运算时,其运算次数是有限的,不能对指针进行无休止的加减法运算。
2、指针的关系运算
两个指向同一数据类型的指针之间的关系运算表示它们所指向的内存单元的地址位置之间的关系(前后关系)。内存单元在内存中的排列是有一定顺序的,指向排在较前面的内存单元的指针小于指向排在较后面的内存单元的指针。
关系运算符:、=、、=、 = =、!=。
注意:(1)指向不同类型数据的指针之间的比较是没有意义的,而指针与一般其他类型的常量或变量之间的关系运算也是没有意义的,除非变量中的内容表示的是地址量。
(2)任何类型的指针变量都可以和零进行相等或不相等的关系运算(判是否为空指针)。
(3)由于具有不同的内存模式,在8088/
您可能关注的文档
- 《平行线的判定-同位角、内错角、同旁内角》参考课件.ppt
- 《意外险和健康险》基础知识及销售实务(PPT 53页).ppt
- 《整合乡土资源引导农村幼儿教师.doc
- 《日语口笔译》课程整体教学设计.doc
- 《桂花雨》教学课例.doc
- 《水轮机检修》--高技.doc
- 【doc】团体健康险直付理赔服务模式初探.doc
- 【PPT】-中国人寿保险公司健康险话术专题(48页)-保险话术.ppt
- 【安邦】车险人伤理赔实务手册.doc
- 【全国百强校首发】黑龙江省哈尔滨市第三中学2016届高三上学期第二次检测数学(文)试题.docx
- 广东省广州省实验中学教育集团2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 广东省广州大学附属中学2025-2026学年八年级上学期奥班期中物理试题(解析版).docx
- 广东省广州市第八十六中学2025-2026学年八年级上学期期中物理试题(含答案).docx
- 广东省广州市第八十九中学2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 广东省广州市第二中学2025-2026学年八年级上学期期中考试物理试题(含答案).docx
- 广东省广州市第八十六中学2025-2026学年八年级上学期期中物理试题(解析版).docx
- 广东省广州市第八十九中学2025-2026学年八年级上学期期中考试物理试题(含答案).docx
- 广东省广州市第二中学2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 2026《中国人寿上海分公司营销员培训体系优化研究》18000字.docx
- 《生物探究性实验教学》中小学教师资格模拟试题.docx
最近下载
- 2025年省考超大杯刷题-申论套卷四.pdf VIP
- 小学学校总务处的工作计划.pptx VIP
- 大学毕业论文__小型液压挖掘机的设计.doc VIP
- 食材配送人员配置与资质要求.docx VIP
- 2025年山东省济南市中考英语试卷试题真题(精校打印版).pdf VIP
- 一种能够在太阳光下快速固化的可剥离去污复合膜及制备方法.pdf VIP
- 骨科临床诊疗指南及操作规范(2025版).docx
- 2025-2026学年小学信息技术(信息科技)四年级下册浙教版(2023)教学设计合集.docx
- 沪科版九年级(上) 中考题同步试卷:22.5 二次函数的应用(18).doc VIP
- 中国的刺腹牙甲属、脊胸牙甲属和凹基牙甲属昆虫鞘翅目牙甲科牙甲族研究.pdf VIP
原创力文档

文档评论(0)