程序设计基础ch5课件_第1页
程序设计基础ch5课件_第2页
程序设计基础ch5课件_第3页
程序设计基础ch5课件_第4页
程序设计基础ch5课件_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 指针与数组学习目标理解指针、地址和数组的概念学会使用数组和字符数组学会指针运算的方法和技巧学会指针作为函数参数的用法理解函数的指针和返回指针值的函数了解指针与二维数组配合的编程方法了解“指针的指针”的定义指针是一种用于存放另一个变量的地址的变量 优点是: 可以生成更高效、更紧凑的代码; 有效地表示复杂的数据结构; 动态分配内存; 得到多于一个的函数返回值 7/28/20221程序设计基础 张杰敏5.1 指针与地址(1)内存单元的编号也叫做地址 通常也把存放地址的变量称为指针或指针变量对于一个内存单元来说,单元的地址(编号)即为指针变量的值,单元的内容是其中存放的数据 7/28/2022

2、2程序设计基础 张杰敏5.1 指针与地址()指针变量的说明包括类型说明、指针变量名和指针所指向的变量的数据类型三个内容,其一般语法形式为:类型说明符 *变量名 其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型 例如:int *p1;表示p1是一个指针变量,它的值是某个整型变量的地址 C语言中提供了地址运算符&来表示变量的地址。其一般语法形式为:&变量名如&a变示变量a的地址,&b表示变量b的地址。变量本身必须预先说明 取内容运算的一般语法形式是:*地址这里“地址”可以是指针变量名、数组名或表示地址的整型表达式 7/28/20223程序设计

3、基础 张杰敏5.1 指针与地址()指针的比较两个指针在一定条件下可以进行比较。如果两个指针p和q指向同一数组,则它们可以进行,、和!等比较运算。例如:pq若指针p指向的位置位于指针q指向的位置之前,则其值为真;反之则为假p=q若指针p和q都指向同一个变量,则其值为真;否则为假p=0若指针p为一个空指针,则其值为真;反之为假p!=0若指针p不是空指针,则其值为真,反之为假 7/28/20224程序设计基础 张杰敏5.2 指针算术运算对指针来说,有加,减两种算术运算,可用的算术运算符有: +,-,+,-,+=和-=运算规则如下:指针的算术运算是根据其类型的长度确定增减量来进行。由于地址计算与其相应

4、数据类型占字节数有关,故指针的增减量,根据其类型的长度确定。 +(-): 指针增运算,即指针向前移动一个数据的位置,指向的新地址为 原地址+(-)sizeof( 类型说明符). 如设:int *p=&k; 则若k的地址为2000, p+ 以后P的值变为2002,而非2001。p每增一次,就将指针指向后一个整数(两个字节),P-后为1998而非1999. +(-):指针变量加(减)正整数n,即表示指针向后(前)移动n个数据,使该指针所指向的地址为原地址+(-) sizcof(类型说明符)*n。如:p=p+5; 之后p值为 2000+5*2=2010。.说明:指针仅能做以上几种算术运算,除此之外的

5、运算即是非法的 7/28/20225程序设计基础 张杰敏5.3 指针与函数参数函数调用过程中有传值和传址两种参数传递方法 指针作为函数参数,使得函数的调用灵活、高效 指针与函数参数的配合使用,常见有三种:函数的参数为指针型、函数的返回值为指针型函数指针(指针的基本类型为函数) 举例说明7/28/20226程序设计基础 张杰敏5.4 数 组()在计算机高级语言中,把具有同一名字,互相有联系且按一定顺序排列的变量称为数组数组中的每一变量都用不同的下标来区别,称为数组元素,0作为第一个元素的下标 需要使用数组时,先要进行定义,然后才能使用 7/28/20227程序设计基础 张杰敏5.4 数 组()一

6、维数组的说明格式。一般语法形式为: 类型 变量名长度类型是指数据类型, 即每一个数组元素的数据类型, 包括整数型、浮点型、字符型、指针型以及后面要讲述的结构和联合 一维数组的初始化赋值的一般语法形式为:类型说明符 数组名常量表达式=值,值值语言规定定义数组的同时可作初始化赋值。在 中的各数据值即为各元素的初值, 各值之间用逗号间隔 一维数组的引用。C语言规定只能逐个引用数组元素而不能一次引用整个数组。数组元素的表示形式为数组名下标7/28/20228程序设计基础 张杰敏5.4 数 组()用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。几点需要说明: 要区别“字符”和“字符串

7、”,字符变量或字符数组的一个元素只能存放一个字符,用单引号引起来 C语言规定了一个“字符串结束标志”,以字符0代表 字符数组的输入/输出方式除了逐个元素(字符)输入输出外,还可以用”%s”格式符整体输入/输出 输出字符不包括结束符0 7/28/20229程序设计基础 张杰敏5.4 数 组()二维数组的定义。一般语法形式为: 类型说明符 数组名常量表达式常量表达式二维数组的理解:可以把二维数组看成是一个一维数组,这个一维数组的每个元素又是一维数组二维数组的元素在内存中的存放循序。按行存放 二维数组中元素的引用。用数组名和下标引用元素 二维数组的初始化 多维数组的一般语法形式为: 类型 数组名第n

8、维长度第n-1维长度.第1维长度7/28/202210程序设计基础 张杰敏5.5 数组的指针指向一个数组的指针称为数组指针,可把数组名或第一个元素的地址赋予它 一个指针变量既可以指向一个数组,也可以指向一个数组元素,如果指针指向了数组,也就是指向了数组的第一个元素(首地址) 当使指针p指向数组a后,可以用指针p访问数组的各个元素 指针和数组在访问内存地址中的数据时,其表达形式具有相同意义。 但指针与数组名具有本质上的不同,数组名是地址,也可理解为指针常量,而指针是地址变量。 指针在使用前必须先赋予一定的地址值 指针用指针取值元素p *(p+0)a0p+1*(p+1)a1p+2*(p+2)a2p

9、+i*(p+i)aip+9*(p+9)a9指针引用数组元素7/28/202211程序设计基础 张杰敏5.6 字符串的指针字符串的指针,又称字符指针,本身是一个变量,用于存放字符串的首地址字符串本身是存放在以该首地址为首的一块连续的内存空间中并以0作为串的结束 字符串虽然是字符数组,但是字符数组和字符指针的概念不同,用字符串指针方式与字符数组方式使用字符串时是有区别的,两者的意义如图 初始化赋值 字符串指针方式: char *ps;ps= Student personnel file; 对数组方式: char st = Student personnel file;7/28/202212程序设计

10、基础 张杰敏5.7 指针数组(1)指针数组是一个数组,该数组中的每一个元素是指针变量。其一般语法形式为: 类型标识符 *数组名数组元素个数例如: int * p4; 定义了一个指针数组,数组名p,有4个元素, 每一个元素是指向整型变量的指针 int (*p)4; /* 指向数组的指针 */ 这句定义一个指针变量,它指向有4个元素的一维数组 7/28/202213程序设计基础 张杰敏5.7 指针数组(2)指针数组主要用于处理多个字符串。字符串本身是一维数组,多个字符串可以用二维数组来处理,但会浪费许多内存。用指针数组处理多个字符串,不会浪费内存。如要将7个国名并按字母顺序排列后输出,一种方法是采

11、用普通的排序方法, 逐个比较之后交换字符串的位置。交换字符串的物理位置是通过字符串复制函数完成的。反复的交换将使程序执行的速度很慢,同时由于各字符串(国名) 的长度不同,又增加了存储管理的负担。另一种较好的方法是使用指针数组,排序前后指针的指向情况见图。把所有的字符串存放在一个数组中,把这些字符数组的首地址放在一个指针数组中,当需要交换两个字符串时, 只须交换指针数组相应两元素的内容(地址)即可,而不必交换字符串本身。下图为排序前后示意图:7/28/202214程序设计基础 张杰敏5.8* 指针的指针指向指针的指针变量说明的一般语法形式为: 类型说明符 * 指针变量名; 例如:右图首先定义说明

12、了指针数组ps并作了初始化赋值。 又说明了pps是一个指向指针的指针变量。在5次循环中, pps 分别取得了ps0,ps1,ps2,ps3,ps4的地址值(如图5-10所示)。再通过这些地址即可找到该字符串 7/28/202215程序设计基础 张杰敏5.9 指针与多维数组(1) 简单指针变量引用多维数组的元素一般地,若需访问二维数组anm(n行m列)的某个元素aij,计算该元素的相对位置公式为: i*m+j (i,j=0,1,2, .) 相当于把二维数组转化为一维数组来使用 如: int a3,4= 1,3,5,7,9,11,13,15,17,19,21,23; int a12= 1,3,5,

13、7,9,11,13,15,17,19,21,23; 引用时使用a13和a7都是指第8号元素,这里即157/28/202216程序设计基础 张杰敏5.9 指针与多维数组(2) 通过指针数组引用多维数组元素对于二维数组可以为其中每个一维数组(每行),设一个指针。也可设一个指针数组,这个指针数组的每一个指针指向二维数组中的每个一维数组如: int a34 = 1,3,5,7,9,11,13,15,17,19,21,23; int *pa3=a0,a1,a2; /* 将3行的首地址赋给指针数组 */ 这时的pa2+1就指向a21,即整型数19 7/28/202217程序设计基础 张杰敏5.9 指针与多

14、维数组(3) 通过二维数组的数组名表达式引用多维数组的元素二维数组的数组名代表该数组的首地址,相当于一个指针常量 二维数组中各一维数组名也是一个指针常量,代表一维数组的首地址。若a的首地址为2000,则右图可以清楚底说明数组名作为指针常量的引用情况 已知某元素的指针后,可以用*运算符访问该元素。只需在*( ) 内写入含数组名的地址表达式,就可以引用数组元素 a0+1a0+2a0+3a0+1a0+2a0+37/28/202218程序设计基础 张杰敏5.9 指针与多维数组(4) 使用指向二维数组的指针变量二维数组指针变量说明的一般语法形式为: 类型说明符 (*指针变量名) 长度其中 “类型说明符”

15、 为所指数组的数据类型。“*” 表示其后的变量是指针类型。“长度” 表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数 设p为指向二维数组的指针变量,把二维数组a34分解为一维数组a0,a1,a2之后,可定义为: int (*p)4;它表示p是一个指针变量,它指向二维数组a 或指向第一个一维数组a0,其值等于a, a0,或&a00等。而p+i则指向一维数组ai。从前面的分析可得出*(p+i)+j是二维数组i行j 列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值 7/28/202219程序设计基础 张杰敏5.10 指针与函数(1)函数的参数为指针 用指针作函数参数

16、,其作用是将一个变量的地址送到被调用函数之中,由此,被调用函数可以操作外部变量或主调出函数定义的变量单元 举例说明7/28/202220程序设计基础 张杰敏5.10 指针与函数(2)函数的返回值为指针 在C语言中允许一个函数的返回值是一个指针(即地址)。函数的返回值为指针型时,该函数常被称为指针型函数。定义指针型函数的一般语法形式为: 存储类型 数据类型 *函数名(形参表) /*函数体*/ 其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。存储类型是指该函数本身的存储特性,一般分为缺省存储类型和static型。数据类型说明符表示了返回的指针值所指向的数据类型 举例说明7/28/202221程序设计基础 张杰敏5.10 指针与函数(3)指向函数的指针 在C语言中规定,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数,然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为函数指针变量或函数(型)指针。函数指针定义和说明的一般语法形式; 存储类型 数据类型(*函数指针名)(); 其中,存储类型是指函数指针本身的存储特性,而数据类型是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论