




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章的主要内容包括:指针指针与变量指针与数组指针与函数,第七章指针,回首页,内存地址:计算机内存的组织方式是把所有单元顺序排列,每个单元有一个顺序编号,称单元的地址。形象化地叫指针地址本身也是用二进制编码的,任何数据对象在它被使用的时候,都必然有一个确定的存储位置,占据着确定数目的存储单元。存储在内存的数据,最终都是根据其存储位置,通过存储单元的地址访问的。任何变量,在其存在期间,总有一个确定的、固定的存储位置,即固定的地址。变量地址可能作为数据来操作。指针变量是C语言提供的一种操作变量地址的机制。指针变量中保存的是其它对象的地址。通过指针变量,可以进行对有关对象的访问和处理。讨论C语言操作指针变量和普通变量的特点,什么是直接存取?什么是间接存取?讨论使用指针进行程序设计的好处,7.1地址和指针的概念,7.2.1指针的定义1.定义指针变量的一般形式如下:类型名*指针变量名1,*指针变量名2,.*指针变量名n;2.空指针空指针是一个特殊的指针,它的值是0,C语言中用符号常量NULL(在stdio.h中定义)表示这个空值,并保证这个值不会是任何变量的地址。空指针对任何指针类型赋值都是合法的。一个指针变量具有空指针值表示当前它没有指向任何有意义的东西。3.viod指针(void*)类型的指针叫通用指针,可以指向任何的变量,C语言允许直接把任何变量的地址作为指针赋给通用指针。当需要使用通用指针所指的数据参加运算时,需要写出类型强制转换。如通用指针gp所指空间的数据是整型数据,p是整型指针,用下式转换:p=(int*)gp;,7.2指针的定义、使用和运算,7.2.2指针的操作指针赋值取地址运算(一元运算符调用由p指向的函数,返回值赋给c。讨论函数指针和返回指针的函数在定义形式上的差别。7.3.4函数体内指针函数体内的指针有可能通过与指针形参的赋值等操作,指向函数体外的存储单元,因此有可能改变调用函数环境中的值,7.3函数与指针,C语言数组和指针的关系极其密切。通过指针访问数组元素的机制是C语言特有的。7.4.1一维数组和指针7.4.1.1数组名和地址关系数组名在C语言中被处理成一个地址常量,也就是数组所占连续存储单元的起始地址,一旦定义,数组名永远是数组的首地址,在其生存期不会改变。不能给数组名重新赋值。但可以用在数组名后加一个整数的办法,依次表达数组中不同元素的地址。如inta10;a与for(i=0;i5;i+)printf(%d,*(a+i);通过a+i,依次指向了a数组的每一个元素。使用*(a+i)引用每一个元素的值。讨论C编译对数组元素寻址的操作过程。,7.4数组和指针,7.4.1.2通过指针引用一维数组元素通过指针引用一维数组元素需要一个指向数组元素的指针变量,它的基类型与数组元素的类型相同。通过指针引用数组元素是C语言提供的一种高效数组访问机制。设p指向数组a某元素地址。则:*p=5;将对应数组元素赋值5。p+1或(p+)也是指针,指向数组下一个元素。p+5;指向p所指元素的后第五个元素。p-1指向p所指元素的前一元素。指针有效范围必须满足数组空间的限制,避免越界访问。这个问题与数组下标越界问题的控制同样重要。讨论使用指针引用数组元素与下标法引用数组元素的比较,7.4数组和指针,7.4.1.3通过带下标的指针变量引用一维数组元素C语言中,一对方括号不仅用作表示数组元素的记号,而且是一种运算符,表示要进行变址运算,在一个基地址上加上相对位移形成一个新地址。设:p指向s数组的首地址时,表示数组元素si的表达式也可以是pi。实际上,p不一定要指向s的首地址,如果p=即p指向s2,则p+3指向s5,p3引用的数组元素是s5。且有五种表示s数组元素si的方法:(1)si(2)*(s+i)(3)*(p+i)(4)pi(5)p指向si使用*p表示si,7.4数组和指针,7.4.1.4指针、数组和函数数组名作函数形参,实质上是一个相应类型的指针参数。如:intfun(inta)与intfun(int*d)是完全等价的。从形参形式上看,传递一个数组名和一个简单变量地址的方式没有任何区别,函数中无法使用sizeof判定数组实际参数的元素个数。要在函数中知道数组元素个数(操作元素个数),应在参数中传入显式的整型值。7.4.2多维数组和指针7.4.2.1二维数组和地址用于说明概念的实例定义:inta34,*p;1.二维数组由若干个一维数组组成。二维数组是由一维数组为元素组成的数组。实例定义了一个二维数组a,a由3个元素组成,分别是a0、a1、a2,而a0、a1、a2中的每一个又是一个由4个元素组成的一维数组。a0的4个元素为a00、a01、a02、a03,其它依此类推。,7.4数组和指针,7.4.2.1二维数组和地址用于说明概念的实例定义:inta34,*p;2.二维数组名也是一个地址常量二维数组名同样也是一个地址常量,其值为二维数组的首元素的地址。实例中a数组是二维数组,a、(a+1)、(a+2)分别是三个数组元素a0、a1、a2的地址,因此,a0与*(a+0)等价,a1与*(a+1)等价,a2与*(a+2)等价。同时,a0、a1、a2也是三个一维数组的名字,数组名a的值与a0的值相同,只是a的基类型为一维数组(一个整行),即a+1的值与a1的值相同,a+2的值与a2的值相同,分别表示数组中第0、第1、第2行的首地址。二维数组名应理解为一个行指针。p=a;是不合法的,因为p和a的基类型不同。同样对二维数组名a,也不能进行赋值的运算。,7.4数组和指针,3.二维数组元素的地址二维数组元素的地址也可以通过每行的首地址来表示。a0、a1、a2是三个一维数组的名字,表示各行的首地址,a0是第0行第0个元素的地址,a0+1第0行第1个元素的地址,.a1是第1行第0个元素的地址,a1+1第1行第1个元素的地址,.ai的移动以元素为单位。实例中,说明符(*ptl)2中,圆括号优先级最高,*首先与ptl结合,说明ptl是一个指针变量,再与说明符2结合,说明指针变量ptl的基类型是一个包含两个int元素的数组,ptl的基类型与a的相同,ptl=a;是合法赋值,ptl+1等价于a+1,等价于a1。当ptl指向a数组开头时,可以通过下面的方法引用aij:*(ptli+j)*(*(ptl+i)+j)(*(ptl+i)jptlijptl是一个变量,值可变,a是一个常量。,7.4数组和指针,7.4.2.3二维数组名作函数实参3.通过行指针引用实参和形参类型匹配,赋值兼容(值传递)当我们实参传递给函数的是二维数组元素的地址,要求形参指针的基类型与数组元素的类型一致。同时,应传入维数信息给函数。形如:int(int*p,intm,intn)当我们调用函数的实参是二维数组的名字,则要求函数指针为行指针,因为二维数组名的基类型是一个行,这时,函数首部可以是下面的几种形式之一:fun(intaMN)fun(intaN)fun(int(*a)N),7.4数组和指针,7.4.3使用指针处理字符串7.4.3.1字符指针字符指针的定义形式为:char*变量名;1.初始化方式使字符指针指向字符串如:char*str=“Programming”;它的含义有三:(1)定义一个字符指针p;(2)建立一个字符串常量;2.用赋值运算使指针指向一个字符串如:char*str;str=“stringone”;与第一种初始化方法完全等价。3.用字符数组作字符串和用字符指针指向的字符串的区别,7.4数组和指针,7.4.3.1字符指针3.用字符数组作字符串和用字符指针指向的字符串的区别如:char*str=“Programming”;与chara=“Programming”;区别如下:(1)str是指针变量,可多次赋值,a是数组名表示地址常量,不能赋值,且a的大小固定,预先分配存储单元。(2)类型、大小不同,str是指针,a是数组。它们的存储不同。(3)a的元素可重新赋值,不能通过str间接修改字符串常量的值。后果无法预料。,7.4数组和指针,7.4.3.2使用字符指针处理字符串和字符数组1.字符指针用于输入输出字符串输出时,输出项可以是字符串或字符数组,也可以是已指向字符串的字符指针。字符串输入时,输入项可以是字符数组,也可以是字符指针。字符指针必须已经指向确切的、足够大的存储空间,以便输入字符能放在它所指的具体单元中。2.常规字符串处理的指针实现实例演示7.4.4指针数组一个数组,其元素均为指针类型数据,称为指针数组。指针数组中每一个元素都相当于一个指针变量。一维指针数组的定义形式为:类型名*数组名数组长度;,7.4数组和指针,7.4.4指针数组例:int*pa5;定义一个5个整型指针为数组元素的一维数组。下图中,用它表示另一个整型数组元素大小关系。,7.4数组和指针,7.4.4指针数组7.4.4.1字符指针数组表示的字符串数组定义字符型指针数组并通过赋初值来构成字符串数组。1字符指针数组的初始化char*days=“Sunday”,“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”,“Saturday”;2字符指针数组与二维字符数组比较二维字符数组表示的字符串在存储上是一片连续的空间,但中间可能有很多空的存储单元,因为作为数组定义,需要指定列数为最长字符串的长度加1,而实际上各字符串长度一般并不相等。字符指针数组表示的字符串在空间上是分散的。,7.4数组和指针,7.4.4.1字符指针数组表示的字符串数组2字符指针数组与二维字符数组比较例:charcolor16=“red”,“green”,“blue”;char*color=“red”,“green”,“blue”;下图是它们的内存表示示意。,7.4数组和指针,7.4.4.2指向指针的指针指针变量的内容是数据的地址,如果数据本身一个指针,这个指针变量就是指针的指针。定义指向指针数据的指针变量的形式如下:char*p;存储形式如下图,7.4数组和指针,7.4.4.3命令行参数main函数可以有参数,指针数组的一个重要应用是作为main函数的形参。讨论main函数的调用方法。main函数的参数,跟在调用命令后,由操作系统传递给主函数,这种机制叫命令行参数。讨论truboC中,调试带有命令行参数的程序时,参数的设置输入方法。1.命令行的一般形式命令行的一般形式为:命令名参数1参数2.参数n命令名和各参数间用空格分隔。,7.4数组和指针,7.4.4.3命令行参数2.C语言如何看待命令行C语言将命令行看作由空格分隔的若干字符串,每个字符串看作是一个命令行参数。由第一个字符串(命令本身)开始从0编号。程序执行时,每个参数被处理作字符串,在程序中按照规定方式使用它们。通过主函数的参数获取命令行参数。3.主函数原型主函数的原型为:main(intargc,char*argv);其中,argc:命令行上字符串总数(包括命令名本身)argv:字符指针数组,存储命令行的每个字符串,argv0是命令名,argv1是第一个参数串,argv2是第二个参数串,.。argc,argv只是形参名称,可以是其它名称,但类型一定要正确。,7.4数组和指针,在任何一个变量使用前,都必须完成关于存储方面的有关安排:存放位置、占据多少存储单元。这个工作叫存储分配。讨论存储空间的静态分配方法讨论引入动态存储管理的好处7.5.1C语言标准动态存储管理函数标准动态存储管理函数原型在标准头文件中描述。1.存储分配函数malloc()void*malloc(size_tn);形参类型size_t:足够大的整数。返回值类型(void*):通用指针,需要通过类型强制转化成特定的指针类型。功能:分配一块能够放下大小为n的存储块,返回指向这个块的指针,如果存储申请不能满足,返回空指针。,7.5动态存储管理,7.5.1C语言标准动态存储管理函数使用动态存储分配函数应该注意以下几点:(1)空间大小计算要使用sizeof函数进行计算;(2)调用malloc函数后,一定要检查返回值;(3)结果强制转换后才能赋值使用;(4)得到的空间使用时不允许越界;2.带初始化的存储分配函数calloc()voidcalloc(size_tn,size_tsize);形参类型size_t:n元素个数;size_tsize:单个元素空间大小。返回值类型为(void*):通用指针,需要通过类型强制转化成特定的指针类型。功能:分配一块能够放下大小为n*size的存储块,全部内容清,返回指向这个块的指针,如果存储申请不能满足,返回空指针。,7.5动态存储管理,7.5.1C语言标准动态存储管理函数3.动态存储释放函数free()voidfree(void*p);功能:释放指针p所指的存储块。如果p的值为空,什么也不做。调用free(q)后,p变量的指向没有改变。但不能再使用它的值。除非重新指向新的数据单元。程序中,应养成对不再使用的存储块立刻释放的习惯。避免造成存储块丢失。4.分配调整函数realloc()void*realloc(void*p,size_tn);功能:更改前面做过的存储分配,指针p指向一个过去分配的存储块,n表示现在希望的存储块大小,如果新的要求不能满足,返回NULL,p仍指向原来的位置。新的分配要求可以满足,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 预应力工程施工进度优化方案
- 光山县2024-2025学年第一学期四年级语文期末学业展示考题及答案
- 农村供水提升工程施工方案
- 2025年机械专业考试试题及答案
- 租赁车间合同范本(含设备搬迁及运输服务)
- 2025年现代汉语下册试题及答案
- 污水处理厂扩建及再生水利用工程建设工程方案
- 房屋租赁合同签订租赁保证金缴纳及退还流程详解
- 零碳循环经济产业园建设项目建设工程方案
- 500MW光伏项目建筑工程方案
- 2024工勤人员考试公共课程考试题库及参考答案
- 集成电路制造工艺原理集成电路制造工艺原理模板
- 质量教育培训计划方案
- 产品追溯及模拟召回演练计划
- 访学归来讲座课件
- Stata统计分析与应用(第3版)
- 设备使用维修和检修技术通则
- 《酸辣土豆丝制作》课件
- 高职教师职业发展规划方案
- 《肠造口术后并发症护理研究进展综述》7400字
- 建设用地报批服务投标方案(技术方案)
评论
0/150
提交评论