




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章,指针和引用,本章主要内容,8.1指针和指针变量8.2指针运算8.3指针和数组8.4指针数组和多级指针8.5指针和函数8.6new和delete运算符8.7引用和其他类型的指针8.8简单链表8.9类型定义,8.1指针和指针变量,8.1.1指针的概念8.1.2指针变量的说明,8.1.1指针的概念,指针:一个变量的地址,一个内存单元的地址。变量的地址:该变量所占存储单元的首地址。变量的值:内存单元中的内容。变量地址的表示:其中,存储类型是可任选的;变量名前的星号指明所说明的变量为指针变量;而类型则指出指针变量所指向的数据类型。1.指针的类型从语法的角度看,只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。2.指针所指向的数据类型当通过指针来访问指针所指向的内存区域时,指针所指向的类型决定数据类型。了编译器将把那片内存区里的内容当做什么来看待。,8.2指针运算,8.2.1指针的赋值运算8.2.2指针的算术运算8.2.3指针的关系运算,8.2.1指针的赋值运算,指针赋值运算常见的形式如下。(1)将一个变量的地址以p初始地址值为DS,那么p+n=DS+nsizeof(datatype)。指针加法的单位是指针对应类型的字节数。例8-4与整数的加或减运算2.指针的自增或自减指针的自增或自减表示指针从当前位置向后或向前移动sizeof(数据类型)长度的存储单元,指向下一个或上一个元素例8-5指针的自增或自减,8.2.3指针的关系运算,指针变量可以进行关系运算,两个指针变量的关系运算是根据两个指针变量值的大小(作为无符号整数)来进行比较的,通常只有同类型的指针变量进行比较才有意义。相等(=)比较的含义是判断两个指针变量是否指向相同的内存单元,即两个指针值是否相同;而不等比较(、=)的含义是判断两个指针变量是否指向不同的内存单元在C+中,同一个符号可能表示不同的运算符。编译器根据运算符的优先级、操作数的类型及个数来区分的。例8-6指针的关系运算例8-7混合运算及其优先级,8.3指针和数组,8.3.1指针与一维数组8.3.2指针与多维数组8.3.3指针和字符串,8.3.1指针与一维数组,如图8.3所示,定义一个数组a10和一个指针pa。inta10,*pa;pa=a;/Apa=/BA、B行的效果是一样的,都是把数组的首地址赋给指针。引用一个数组元素,有3种方法:(1)下标法:ai。(2)数组名地址法:*(a+i)。(3)指针法:指针地址法:*(pa+i)指针下标法:pai,图8.3一维数组与指针示意图,例8-8一维数组与指针,8.3.2指针与多维数组,在C+中,二维数组的各个元素值按行的顺序在一片连续的内存空间中存放。行数组首地址a,相当于/定义了一个指针数组,该数组有4个指针元素int(*p)4;/定义了一个指针,该指针指向一个有4个元素的数组因为运算符的优先级高于*,所以用圆括号()将*与指针变量名括起来以改变运算符的优先级顺序,使*先作用于指针变量,然后再与结合,形成指向一维数组的指针变量。例8-15指向一维数组的指针变量,8.4.3多级指针,如果指针变量中存放的是另一个指针的地址,就称该指针变量为指向指针的指针变量。指向指针的指针变量也称为二级指针。其声明的语法格式为:*两个符号*表示后面声明的变量为指向指针的指针变量。例8-16通过多级指针访问指针数组元素例8-17多级指针的简单应用,8.5指针和函数,8.5.1指针作为函数的参数8.5.2返回指针的函数8.5.3指向函数的指针8.5.4带参数的main()函数,8.5.1指针作为函数的参数,当形参为指针时,实参可以是一个基类型相同的指针变量或变量的地址。当函数的参数为指针时,可将指针值和指针所指向的数据作为函数的输入参数,即在函数体内可使用指针值和指针所指向的数据值。也可将指针所指向的数据作为函数的输出参数,即在函数体内改变了形参指针所指向的数据值,调用函数后,实参指针所指向的数据也随之改变。例8-18用值传递和地址传递实现两个数据的交换例8-19形参为指针、实参为数组名和指针例8-20形参为数组名,实参为数组名和指针,8.5.2返回指针的函数,函数的返回值可以为整型、实型、双精度型、字符型数据,也可以为指针,返回指针值的函数的定义方法如下:类型说明符*函数名(参量表列)函数体其中类型说明符为函数返回的指针指向的数据类型。例8-21返回指针的函数例8-22利用函数求两个一维数组对应元素之和,8.5.3指向函数的指针,编译器为每个函数确定一个入口地址,当调用该函数时,系统会从这个“入口地址”开始执行函数。存放函数的入口地址的指针就是一个指向函数的指针,简称为函数指针。定义函数指针的格式为:(*)();注意在定义指向函数的指针变量假设为p时,(*p)两侧的括号不可省略,表示p先与*结合,它是指针变量,然后再与后面的()结合,表示此指针变量指向函数;否则将与返回指针的函数相混淆。,8.5.3指向函数的指针,例8-23指向函数的指针例8-24用指向函数的指针实现比较大小的运算例8-25从任意类型的数组中找出最大元素,8.5.4带参数的main()函数,为执行一个可执行文件而在操作系统提示符下输入的命令叫命令行。命令行一般语法形式:命令名参数1参数2.参数n带参数的main()函数形式:main(intargc,char*argv).形参名任意,习惯上使用argc和argv,其中argc为命令行中参数的个数(包括可执行文件名),而argv为一字符指针数组,元素个数随命令行参数而定,每个指针数组元素都指向命令行中的一个参数。例8-26带参数的main()函数,8.6new和delete运算符,8.6.1new和delete运算符的用法8.6.2使用new和delete运算符的注意事项,8.6.1new和delete运算符的用法,1.new操作符的使用C+提供了操作符new和new来创建动态变量。(1)new用来动态创建单个变量。语法格式为:new(2)可以在申请内存空间时,同时对该内存空间初始化。(3)new用来创建动态变量数组,语法格式为:2.delete操作符的使用(1)delete。释放所指向的内存空间。对应上面的第一点,释放时用语句:deletep;/释放p所指向的内存空间(2)delete或者delete例8-27动态实现内存分配和撤销,8.6.2使用new和delete运算符的注意事项,两个运算符,应注意以下几点。(1)用new运算符分配的存储空间,其初值是不确定的。(2)用new运算符分配空间后,要判断指针的值是否为0。若为0,表示动态分配内存失败。(3)定义一个指针,动态分配数组时,不能对数组进行初始化。(4)当new运算符计算的指针类型与赋值运算符左操作数类型不一致时,必须进行强制类型装换。(5)用new运算符分配的内存空间,该指针不能随意指向别的空间;否则,当指针已不再指向用new运算符分配的内存空间时,delete会出错。(6)不需要时一定要及时归还给操作系统,让操作系统能够分配给其他需要内存的指针。,8.7引用和其他类型的指针,8.7.1引用类型变量的说明和使用8.7.2函数的引用传递8.7.3const类型变量8.7.4void型指针,8.7.1引用类型变量的说明和使用,在C+中引入引用类型的主要目的是为了在函数的参数传递时提供方便。引用类型主要用作函数的参数或用作函数的返回值类型。定义一个引用类型变量的一般格式为:定义了一个引用类型的变量aa,它是变量a的别名。例8-28利用类型变量的使用示例,8.7.2函数的引用传递,1.引用作为函数的参数引用可以作为函数的参数,建立函数参数的引用传递方式。传递引用实际上传递的是变量的地址,这一点与指针是一样的,但是这种传递方式避免了传递大量数据带来的额外空间开销,从而节省大量存储空间,减少了程序运行的时间。2.函数的返回值为引用类型当函数的返回值为引用类型时,它的返回值一定是某一个变量的别名。例8-29函数的引用传递例8-30函数的返回值为引用类型,8.7.3const类型变量,1.定义const型常量constintDeadLine=365;constfloatA=1.00009;用const定义的标识符常量时,一定要对其初始化。2.const型指针const是一个左结合的类型修饰符,用于指针的有以下几种情况。(1)将const放在指针变量的类型的前面:constint*A;表示指针变量A可变,指针所指向的数据*A不可变。(2)将const放在指针变量的*的后面:int*constA;表示指针A不可变,但指针变量所指向的数据*A可变,在定义时必须赋初值。(3)将一个const放在指针变量的类型的前面,将另一个const放在指针变量的*的后面:constint*constA;/表示指针变量所指向的值是一个常量,即指针A可变,指针所指向的数据也是一个常量,*A也不可变。在定义时必须赋初值。例8-31const型指针示例之一,8.7.4void型指针,说明void型指针的语法格式为:void*;其中,“指针变量”可指向任何类型的数据,可将任何地址赋给指针变量。实际使用void型指针时,只有通过强制类型转换才能使void型指针得到具体变量的值。在没有转换前,void型指针不能进行指针的算术运算。例8-33void型指针使用错误的示例例8-34强制类型转换后使用void型指针示例,8.8简单链表,8.8.1链表概述8.8.2建立链表8.8.3链表的输出8.8.4链表的插入8.8.5链表的删除,8.8.1链表概述,链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。链表的结构如图8.11所示。,图8.11链表结构示意图,8.8.2建立链表,创建链表的基本步骤如下:第一步,创建第一个节点,并将此节点的内存地址保存第二步,创建第二个节点,将第二个节点的首地址保存在第一个节点的成员变量中。第三步,以此类推,创建第n个节点,并将此节点的地址存储到第n-1节点的成员变量中。例8-35建立无序链表的函数,8.8.3链表的输出,链表的输出步骤如下:(1)找到表头。(2)若是非空表,输出节点的值成员,是空表则退出。(3)跟踪链表的增长,即找到下一个节点的地址。例8-36链表的输出,8.8.4链表的插入,在链表中插入节点的基本步骤如下:第一步,获得第一个节点的地址。第二步,找到插入节点的位置。第三步,创建新的节点InsertNode。第四步,将当前节点的下一节点信息存储到新创建节点InsertNode的成员变量。第五步,将InsertNode的地址存储到当前节点的成员变量中。第六步,结束。例8-37链表的插入,8.8.5链表的删除,删除链表的基本步骤如下:第一步,获得第一个节点的地址。第二步,根据第一个节点获得第二个节点地址。第三步,调用fre
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 42125.9-2025测量、控制和实验室用电气设备的安全要求第9部分:能测量电网电源电压的家用和专业用手持万用表和其他仪表的特殊要求
- 应急安全教育培训计划课件
- 应急安全培训心肺复苏课件
- 2024-2025学年自考专业(金融)考前冲刺练习试题附参考答案详解【预热题】
- 粮油食品检验人员模拟试题【重点】附答案详解
- 高校教师资格证之《高等教育法规》考前冲刺分析及答案详解(有一套)
- 套餐合同(标准版)
- 中老年舞厅运营方案范文
- 2024监理工程师模拟试题带答案详解(预热题)
- 2025年数字艺术作品版权保护与版权保护产业政策解读与实施研究报告
- 2025劳动教育考试试题及答案
- 部编初一初中语文阅读理解答题公式大全(绝对有用)+专项训练练习题
- 《涉外法治概论》课件 杜涛 -第1-6章 涉外法治的基础理论-涉外经济管理法律制度
- 江苏省南通市如皋市2025-2026学年高三上学期开学考试数学试卷
- 2025年义务教育语文新课程标准考试测试题库及参考答案
- 无菌GMP基础知识培训课件
- 2025至2030中国光学旋转编码器行业调研及市场前景预测评估报告
- 肺炎合并胸腔积液护理查房
- 减重药物临床应用医药专家共识
- 2024年中国中间相沥青行业调查报告
- 2025至2030细胞免疫项目融资商业计划书
评论
0/150
提交评论