




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章 指针 C语言的特色之一、也是其精华所在就是指针。使用指 针可以实现以下用其它方法不易实现的操作:对内存中的 数据进行处理,而不管这些数据的类型;在函数之间快速 地传递数据;直接处理内存地址。这种方法增强了C语言的 处理能力、提高了程序的执行效率,尤其是适合系统软件 的开发,也极大地增强了程序的灵活性。指针不仅不易理 解,而且使用不当会带来严重的错误。可以说,是否掌握 指针,是业余爱好者与专业程序员的分水岭。 学好指针,关键是理解其概念与操作原理。 退出 11.1 指针的基本概念 11.2 指针变量的运算 11.3 数组指针变量的说明和使用 11.4 字符串指针变量的说明和使用 11.5 函数指针变量 11.6 指针型函数 11.1 指针的基本概念 11.1.1 11.1.1 了解指针了解指针 在计算机中,所有的数据都是存放在存储器中的。为了正确 地访问这些内存单元,必须为每个内存单元编上号。根据一个内 存单元的编号即可准确地找到该内存单元。内存单元的编号也叫 做地址。通常也把这个地址称为指针。 对于一个内存单元来说,单元的地址即为指针,其中存放的 数据才是该单元的内容。通常用一个变量来存放指针,这种变量 称为指针变量。因此,一个指针变量的值就是某个内存单元的地 址或称为某内存单元的指针。 11.1.2 11.1.2 指针变量的类型说明指针变量的类型说明 对指针变量的类型说明包括三个内容: l指针类型说明,即定义变量为一个指针变量; l指针变量名; l变量值(指针)所指向的变量的数据类型; 其一般形式为: 类型说明符类型说明符 * *变量名;变量名; 其中,*表示这是一个指针变量,变量名即为定义的指针变量 名,类型说明符表示本指针变量所指向的变量的数据类型。 例如: intint *p; *p; 表示p是一个指针变量,它的值是某个整型变量的地址。或者 说p指向一个整型变量。至于p究竟指向哪一个整型变量,应由向 p赋予的地址来决定。再如: staticstatic int int *p; /* p *p; /* p是指向静态整型变量的指针变量是指向静态整型变量的指针变量 */ */ float *p; /* pfloat *p; /* p是指向浮点变量的指针变量是指向浮点变量的指针变量 */ */ char *p; /* pchar *p; /* p是指向字符变量的指针变量是指向字符变量的指针变量 */ */ 指针变量本身一定是整数(就像房间号一样),类型差别只 是所指地址中存放的数据的差别。 指针应具有“始终如一”的特点,也就是说,一个指针变量只 能指向同类型的变量,不能时而指向一个浮点变量,时而又指向 一个字符变量。这就好比商品的标签一样,贴计算机的标签不能 贴在化妆品。 11.1.3 11.1.3 指针变量的赋值指针变量的赋值 指针变量也是变量,所以与普通变量同样,必须在使用前赋 值。未经赋值的指针变量不能使用。当然,指针变量的赋值只能 赋予地址,而不能赋予其它数据。因为变量的地址是由编译系统 分配的,所以用户不知道变量的具体地址。因此,通过与变量之 间的关系来确定它的值。引入地址运算 ; 如 a; int int *p= *p= (2) 赋值语句的方法 intint a; a; intint *p; *p; p= /* p= /* 不能写为不能写为* *p= *p; p=23; p=23; 在赋值语句中,被赋值的指针变量前不能再加“*”说明符,如 写为*p= a,*pa; pa= /* pa= /*把整型变量把整型变量a a的地址赋予整型指针的地址赋予整型指针 变量变量pa*/pa*/ (3) 传递指针 把一个指针变量的值赋予指向相同类型变量的另一个指针变 量。如: intint a,*pa= ; pb pb=pa; /*=pa; /*把把a a的地址赋予指针变量的地址赋予指针变量pbpb*/*/ 由于pa,pb均为指向整型变量的指针变量,因此可以相互赋值 。 (4) 取数组地址 把数组的首地址赋予指向数组的指针变量。例如: intint a6,*pa; a6,*pa; pa=a; pa=a; (数组名表示数组的首地址,故可赋予指向数组 的指针变量pa) 也可写为: pa= /*pa= /*数组第一个元素的地址也是整个数组数组第一个元素的地址也是整个数组 的首地址,也可赋予的首地址,也可赋予pa*/pa*/ 当然也可采取初始化赋值的方法: intint a6,*pa=a; a6,*pa=a; (5) 取字符串首地址 把字符串的首地址赋予指向字符类型的指针变量。例如: char *char *pcpc; ; pc pc=“Hello“;=“Hello“; 或用初始化赋值的方法写为: char *char *pcpc=“Hello“;=“Hello“; 注意,并不是把整个字符串装入指针变量,而是把存放该字符串 的字符数组的首地址装入指针变量。 (6) 去函数的入口地址 把函数的入口地址赋予指向函数的指针变量。例如: intint (*pf1)(); (*pf1)(); pf1=f; /* f1 pf1=f; /* f1为函数名为函数名 */ */ 2 加减算术运算 由于指针是整数,所以可加上或减去一个整数n。设pa是指向 数组a的指针变量,则以下运算都可以: pa+n,pa-n,pa+,+pa,pa-,-papa+n,pa-n,pa+,+pa,pa-,-pa 指针变量加或减一个整数n的意义为:把指针指向的当前位置 (指向某数组元素)向前或向后移动n个位置。这有点像数据库中的 在记录之间移动。 数组指针变量向前或向后移动一个位置表示指针变量指向下 一个数据元素的首地址。而不是在原地址基础上加1。 指针没有移动之前: 数组a: a1a1a2a2a3a3a4a4a5a5a6a6 指指 针针 指针向后移动一个位置: 数组a: a1a1a2a2a3a3a4a4a5a5a6a6 指指 针针 指针变量的加减运算只能对数组指针变量进行,对指向其它类型 变量的指针变量作加减运算是毫无意义的。 3 两指针变量相减 运算只能在同一数组的两个指针变量之间进行。 两指针变量相减所得之差是两个指针所指数组元素之间相差 的元素个数。实际上是两个指针值(地址)相减之差再除以该数组 元素的长度(字节数)。 另外,两个指针变量不能进行加法运算,因为没有实际含义 。 【例11-2】(见课本) 【例11-3】(见课本) 11.3 数组指针变量的说明和使用 11.3.1 11.3.1 数组的存储方式数组的存储方式 一个数组在内存中占据连续的内存单元。数组名为此连续内 存单元的首地址。一个数组元素也可以占据几个连续的内存单元( 取决于数组元素的数据类型)。一个数组元素的首地址也是指它所 占有的几个内存单元的首地址。 11.3.2 11.3.2 数组指针变量数组指针变量 指向数组的指针变量称为数组指针变量。一个指针变量既可 以指向一个数组,也可以指向一个数组元素,可把数组名或第一 个元素的地址赋予它。如要使指针变量指向第i号元素可以把i元 素的首地址赋予它或把数组名加i赋予它。 可以用以下两种方法来访问数组元素:其一为下标法,即用 ai形式访问数组元素,这是较为普通的方法。其二为指针法,即 采用*(pa+i)形式,用间接访问的方法来访问数组元素。 【例11-4】(见课本) 【例11-5】(见课本) 【例11-6】(见课本) 11.4 字符串指针变量的说明 和使用 字符串指针变量的定义说明与指向字符变量的指针变量说明 是相同的。只能按对指针变量的赋值不同来区别。对指向字符变 量的指针变量应赋予该字符变量的地址。如: char c,*p=char c,*p= 表示p是一个指向字符变量c的指针变量。而: char *s=“Hello“;char *s=“Hello“; 则表示s是一个指向字符串的指针变量。把字符串的首地址 赋予s。 【例11-7】(见课本) 【例11-8】(见课本) 11.5 函数指针变量 如前所说,指针变量可以指向整型变量、字符变量和数组等 。下面讲述把指针变量指向函数的用法。这种指向函数的变量叫 做函数指针变量。 为什么指针可以指向函数呢?这要从函数的存储特性说起。 尽管函数并不是一个变量。但是,一个函数总是占用一段连 续的内存区,而函数名就是该函数所占内存区的首地址。因此可 以把函数的首地址(或称入口地址)赋予一个指针变量,使该指针 变量指向该函数。然后通过指针变量就可以找到并调用这个函数 。 11.5.1 11.5.1 函数指针变量的定义函数指针变量的定义 函数指针变量定义的一般形式为: 类型说明符类型说明符 (* (*指针变量名指针变量名)();)(); 其中: “类型说明符”表示被指函数返回值的类型。 “(* 指针变量名)”表示“*”后面的变量是定义的指针变量。 最后的空括号“()”表示指针变量所指的是一个函数。例如: intint (*p)(); (*p)(); 表示p是一个指向函数入口的指针变量,该函数的返回值(函 数值)是整型。 这里的函数指针变量p并不固定地指向某一具体函数。在程 序中把那个函数的地址赋给它,它就指向那个函数。这就是其“变 量”属性的特点。当然,函数返回值的类型应与它的类型一致。 【例11-9】(见课本) 11.5.2 11.5.2 函数指针变量的调用函数指针变量的调用 调用函数的一般形式为: (* (*指针变量名指针变量名) () (实参表实参表) ) 比较如下两种调用形式: c=(*p)(a,b);c=(*p)(a,b); c=max(a,b); c=max(a,b); 形式上只是用(*p)替代函数名而已。 使用函数指针变量还应注意以下两点: 不能对函数指针变量进行算术运算,这与数组指针变量不同 。数组指针变量加减一个整数可使指针移动指向后面或前面的数 组元素,而函数指针的移动毫无意义; 函数调用中“(*指针变量名)”的两边的括号不可少; 11.5.3 11.5.3 函数指针变量的赋值函数指针变量的赋值 给函数指针变量赋值时,只需要给出函数名,而无需给出参 数。因为赋值只是把函数的入口地址赋给指针变量,并不涉及实 参与形参。例如: p=max;p=max; 不能写为: p=max(a,b);p=max(a,b); 11.5.4 11.5.4 函数指针变量的无参调用函数指针变量的无参调用 可以使用如下形式来调用无参函数: (* (*p)();p)(); 11.6 指针型函数 如前所述,函数可以返回整数型、实数型及字符型的值。其 实,它也可以返回指针型的值。这种返回指针值的函数称为指针 型函数。 11.6.1 11.6.1 指针型函数的定义指针型函数的定义 定义指针型函数的一般形式为: 类型说明符类型说明符 * *函数名函数名( (形参表形参表) ) 函数体函数体 其中的“*”表明这是一个指针型函数,即返回值是一个指针。 类型说明符表示了返回的指针所指向的数据类型。 【例11-10】(见课本) 11.6.2 11.6.2 指针型函数必须在主函数中说明指针型函数必须在主函数中说明 要使用一个指针型函数,必须在主函数中对所定义的函数加 以说明(参看例11-11)。 11.6.3 11.6.3 局部变量不可返回局部变量不可返回 不能把指针型函数的内部说明的局部变量的地址作为返回值 。这是因为局部变量在函数运行结束后被释放,相应的地址也要 让出来,可能存放其它数据。例11-11中所使用的就是静态变量。 11.6.4 11.6.4 一致性一致性 指针型函数中return语句的返回值必须与函数的数据类型相 一致的指针。 11.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 驾驶员考试试题及答案
- 2025年自动驱鸟设备合作协议书
- 2024年许昌市教育科学研究中心教研员真题
- 2024年东营市育才学校招聘教师真题
- 大棚樱桃管理知识培训课件
- 2025年宝马轿跑车项目提案报告
- 屠宰条例课件
- 短途客运合同
- 悦己借款合同
- 承包商协议模板
- 2025至2030临床前CRO治疗行业发展趋势分析与未来投资战略咨询研究报告
- 2025年浙江省中考数学试卷真题(含官方标准答案)
- 幼儿园物资报损管理制度
- 酒精戒断综合症治疗方案讲课件
- 【9语安徽中考卷】2025年安徽省中考招生考试真题语文试卷(真题+答案)
- 工程造价培训用课件
- 《人工智能概论-面向通识课程》全套教学课件
- 三区人才面试题及答案大全
- 城市轨道交通施工机械设备管理措施
- 2024年云南师范大学辅导员考试真题
- 《2023 AHA心肺复苏与心血管急救指南》解读
评论
0/150
提交评论