《工信版(中职)编程语言基础——C语言模块7教学课件.ppt》由会员分享,可在线阅读,更多相关《工信版(中职)编程语言基础——C语言模块7教学课件.ppt(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Y CF(中职)编程语言基础C 语言模块7 教学课件模块7 指针 任务1 指针的概念 任务2 指向简单变量的指针 任务3 指针与数组 任务4 指向字符串的指针变量 任务5 指向函数的指针变量 任务6 指针变量作为函数参数 任务7 指向结构体变量的指针任务1 指针的概念 程序中的变量在运行时要占用内存单元,用来存放变量的内容。内存单元按顺序编号,称为内存地址,它相当于门牌号,系统根据内存地址存取数据。在C 语言中,指针是一种数据类型,指针变量是用来专门存放所指对象地址的变量,也就是说,数据值是存放在指针所指的对象中,而不是在指针变量中。例如,我们定义了一个变量px,把x 的地址1000 存放在变
2、量px 中,通过px 可以间接地访问x 变量。px 就是指向x 的指针变量,px 和它所指对象x 的关系如图7-1 所示。返回任务2 指向简单变量的指针 7.2.1 指针变量的定义 指针变量在C 语言中是一个重要的概念,指针变量定义的一般形式为:其含义是:指明标识符是存放某类型变量的地址变量,又称标识符为指向类型标识符的指定变量,简称标识符为指向类型标识符的指针。例如int*px,x;表明px 是指向某一整型变量的指针变量。指针变量是一个变量,是存放地址的变量。设有一个指针变量px,若把变量x 的地址赋给px,即:返回 下一页任务2 指向简单变量的指针 则变量x 的地址被放入指针变量px 的存
3、储空间中,其关系如图7-2 所示。当指针得到某一地址时,称该指针指向了那个地址的存储空间;指针指向的存储区域中的数据称为指针的目标。在程序中用“*”表示指针的目标,即:*px 表示的是px 的目标x。其实*px 是一个运算表达式,也就是说:“*”是一个运算符,称为访问目标运算符,它只有一个运算量,而且必须是地址量。在对指针的实际运用中,经常会用到以下操作。对指针变量赋地址,即指针的初始化;利用指针可以间接访问变量。上一页 返回 下一页任务2 指向简单变量的指针【例7-1】使用指针实现对变量的间接访问。上一页 返回 下一页任务2 指向简单变量的指针 7.2.2 指针的用途和用法 由于指针是一种存
4、放变量地址的特殊变量,因而为指针初始化的方法就是将1 个变量的地址赋给1 个指针变量。(1)取地址运算符”&”。在C 程序设计中,1 个变量在内存中存放时具有确定的地址,但是对于程序设计者来说,具体地址是多少并不重要。使用取地址运算符”&”可以获得1 个变量在内存中的地址。上一页 返回 下一页任务2 指向简单变量的指针(2)将变量地址赋给指针。程序中的语句组”p=&a;q=&b;”的功能是把整型变量a、b 的地址赋给指针变量p、q,这就是对指针变量的赋值操作。注意:对指针变量所赋的值一定是地址值。我们可以使用3 种地址值:变量的地址:其表示方法为&变量名,如程序中&a 和&b 数组名:数组名表
5、示数组的首地址。已经定向的指针:其中保存了1 个变量的地址。上一页 返回 下一页任务2 指向简单变量的指针(3)取内容运算符“*”。在指针的前面添加“*”运算符可以获得该指针所指向变量的值,因此将“*”运算符称为取内容运算符。当将一个指针指向一个变量后,使用“*”可以实现对变量的间接访问。举例说明。上一页 返回 下一页任务2 指向简单变量的指针 使用间接访问的方法不但可以将数据读出,还可以将数据写入。注意:在指针定义语句中“*”只是一个指针标志符号,主要说明定义的变量为指针变量,不是取内容的运算符号,举例对比。上一页 返回 下一页任务2 指向简单变量的指针 正因为如此,可以在指针定义的同时对其
6、进行定向,例如:(4)除了给指针赋1 个确定的地址外还可以为指针赋1 个空值,这时该指针并没有指向个确定的地址,例如:上一页 返回 下一页任务2 指向简单变量的指针(5)在C 语言中,虽然在定义1 个变量后系统就为该变量在内存中分配了一定大小的存储空间。但究竟此单元的地址是多少,用户是很难知道的。其实,在实际的操作中,通常并不需要知道1 个变量在内存中的地址编号是多少,在程序中只需用相应的表达式表示出1 个变量的地址即可,例如使用语句:上一页 返回任务3 指针与数组 7.3.1 一维数组的指针和指向一维数组的指针变量 1.数组的指针与数组元素的指针 数组元素的指针是指数组中某个具体元素的地址。
7、数组的指针则是数组的首地址,也叫起始地址,是数组中最开头那个元素的地址。C 语言程序中,数组名本身就代表该数组的首地址。返回 下一页任务3 指针与数组 2.指向数组元素的指针变量的定义与赋值 定义一个指向数组元素的指针变量的方法一般如下:注意:必须保证数组类型和指针变量所指向的变量类型保持一致。如果数组为int 型,则指针变量应指向int 型;如果数组为float 型,则指针变量应指向float 型。对指向数组的指针变量赋值有两种方法:将数组的地址赋给指针变量和将数组元素的地址赋给指针变量。上一页 返回 下一页任务3 指针与数组 3.指针法引用数组元素 假定:那么 a 代表数组a 的首地址&a
8、0,p 的值也是&a0,*p 和*a 则表示a0。a+1 的值是&a1,p+1 的值也是&a1,*(a+1)和*(p+1)则表示 a1 a+i 的值是&ai,p+i 的值也是&ai,*(a+i)和*(p+i)则表示ai上一页 返回 下一页任务3 指针与数组 上述文字可用图7-3 来形象地表示。数组中元素ai 的实际地址为:a+i*d,d 为一个数组元素所占的字节数。例如:如果a=2001;则元素a5 的实际地址为2001+5*2,即2011。因为一个int 型数据占2 个字节。P 是指针变量,可以进行递增和递减运算,例如:p+;p-;是合法的,但a 不能进行递增和递减运算,例如:a+:a-是非
9、法的。因为a 是数组名,代表首地址,在程序中是固定不变的,不能进行递增和递减运算。上一页 返回 下一页任务3 指针与数组 例7-3 用指针法输入输出数组元素的值。上一页 返回 下一页任务3 指针与数组 例7-3 的程序可以写成下面的指针法形式,其结果仍然不变。程序如下:上一页 返回 下一页任务3 指针与数组 例7-3 的程序还可以写成下面的指针法形式,其结果也是不变的。上一页 返回 下一页任务3 指针与数组 7.3.2 内存的动态分配 在C 语言程序中,当定义任何一个类型数据对象时,程序都会自动分配足够的内存空间来存储这些数据,特别在处理较多的数据时,通常使用数组。数组具有静态性,必须在程序编
10、译前确定数组的大小,不能在程序运行时根据数据的实际多少来确定数组的大小,那样往往造成内存资源的浪费,降低程序效率。对数据使用动态存储的一般步骤如下:确定需要多少内存空间一分配需要的存储空间一使指针指向获得的内存空间一用完后释放掉这部分内存空间。上一页 返回 下一页任务3 指针与数组 1.malloc()函数 作用:从堆中申请分配一个大小为size 字节的内存块,函数使用完毕后,返回一个指针值,它指向新分配的内存块。如果堆不够分配,则返回的指针值为NULL。使用malloc()函数,必须将其头文件”stdlib.h”包含进来。在计算内存空间大小时,通常使用sizeof 运算符来计算单个数据所需的
11、字节数。上一页 返回 下一页任务3 指针与数组上一页 返回 下一页任务3 指针与数组上一页 返回 下一页任务3 指针与数组 2.calloc()函数 作用:从堆中申请分配n 个大小为size 字节的连续内存块,函数使用完毕后,返回一个指针值,它指向新分配的首个内存块。如果堆不够分配,则返回的指针值为NULL。使用calloc()函数,必须将其头文件”stdlib.h”包含进来。上一页 返回 下一页任务3 指针与数组上一页 返回 下一页任务3 指针与数组上一页 返回 下一页任务3 指针与数组 3.free()函数 作用:释放指针变量P 所指向的内存块。使用free()函数,必须将其头文件”std
12、lib.h”包含进来。上一页 返回 下一页任务3 指针与数组上一页 返回 下一页任务3 指针与数组 4.realloc()函数 realloc()函数的原型如下:作用:对已经申请成功的内存块进行缩小或扩大重新分配申请,使之大小变为size 字节,函数使用完毕后,返回一个指针值,它指向重新分配的内存块,如果重新分配申请不成功,则返回的指针值为NULL。使用rallot()函数,必须将其头文件”stdlib.h”包含进来。上一页 返回 下一页任务3 指针与数组上一页 返回 下一页任务3 指针与数组上一页 返回 下一页任务3 指针与数组 7.3.3 二维数组的指针和指向二维数组的指针变量 指针变量可
13、以指向一维数组,也可以指向二维数组,下面介绍二维数组的指针及指向二维数组的指针变量的一些基本概念和使用方法。1.二维数组的指针与地址。二维数组的指针就是二维数组的地址。假定有一个二维数组如下:上一页 返回 下一页任务3 指针与数组 可以得出以下结论上一页 返回 下一页任务3 指针与数组 2.指向二维数组的指针变量 C 语言程序中,一个指针变量可以指向二维数组的某一行(指向一维数组),也可以指向二维数组中的某一个元素(指向具体数据)。如果一个指针变量指向二维数组中的某一个元素,该二维数组可以通过元素相对地址的转换计算,用一维数组的方法来处理。例7-4 用指向某一元素的指针变量输出二维数组中的元素
14、值。上一页 返回 下一页任务3 指针与数组上一页 返回 下一页任务3 指针与数组 例7-5 用指向二维数组某一行的指针变量输出二维数组中的元素值。上一页 返回 下一页任务3 指针与数组 例7-6 一个班有3 个学生,各学4 门功课,计算其平均分及第n 个学生的成绩。上一页 返回 下一页任务3 指针与数组上一页 返回 下一页任务3 指针与数组上一页 返回任务4 指向字符串的指针变量 7.4.1 字符串的表示形式 在C 语言中,没有专门存放字符串的变量,一个字符串可以放在一个字符数组中,数组名就表示该字符串中第一个字符存放的地址,也可以将字符串的首地址赋给一个字符型指针变量,该指针变量便指向这个字
15、符串。例如:返回 下一页任务4 指向字符串的指针变量【例7-7】用字符数组来处理字符串。上一页 返回 下一页任务4 指向字符串的指针变量【例7-8】用字符串指针来实现处理字符串。上一页 返回 下一页任务4 指向字符串的指针变量 说明:(1)首先定义指针变量str,并使其指向字符串“I love China!”的首地址。(2)在printf(%sn,str)语句中,系统从str 所指向的地址输出一个字符串,即输出:I love China!(3)在for 循环语句中,条件判断语句判断字符串是否结束,循环体中的语句是输出当前的str 所指向的字符,输出之后str 进行加1,指向需要处理的下一个字符
16、。上一页 返回 下一页任务4 指向字符串的指针变量【例7-9】输出字符串中n 个字符之后的所有字符。上一页 返回 下一页任务4 指向字符串的指针变量【例7-10】使用字符指针,把一个字符串的内容复制到另一个字符串中。分析:将字符串a 的内容复制到另一个字符串b 中的方法是从a的第一个元素开始逐个复制到b 中,一直到最后一个元素。特别注意,一定要把字符串的结束标志复制到b 中。上一页 返回 下一页任务4 指向字符串的指针变量上一页 返回 下一页任务4 指向字符串的指针变量 7.4.2 字符串指针变量与字符数组的区别 从上面的例子可以看出,使用字符数组和字符指针变量都可实现字符串的存储和运算。两者
17、既有相同之处,又有区别。在使用时应注意以下几个问题:(1)字符数组是由若干个字符元素组成的,它可用来存放整个字符串。字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该指针变量为首地址的一块连续的内存空间。(2)赋值方式不同。字符串赋给字符数组只能在初始化的时候进行,即上一页 返回 下一页任务4 指向字符串的指针变量 这是因为字符数组定义之后,只能对字符数组的各元素逐个赋值。对于字符指针:上一页 返回任务5 指向函数的指针变量 7.5.1 函数的指针 前面介绍指针概念的最终目标都是要处理数据,所以称它们为数据指针。在C 语言中,指针除了可以保存数据的存储地址外,还可以
18、保存函数存储的首地址(即函数的执行入口地址)。指针变量持有函数的入口地址时,它就指向了该函数,称这种指针为指向函数的指针。函数的指针在程序中的说明形式如下。上一页 返回 下一页任务5 指向函数的指针变量 注意以下几点问题。(1)圆括号不能省。(2)存储类型是函数指针本身的存储类型。(3)数据类型是指针指向的函数具有的数据类型。(4)函数名具有该函数的存储首地址,即函数的执行入口地址。例如,在程序中定义了如下函数:上一页 返回 下一页任务5 指向函数的指针变量 7.5.2 指向函数的指针的应用 指向函数的指针的主要用途是在函数之间实现函数传递。函数传递实质上是函数地址的传递。在函数调用中,如果想
19、在调用函数中把一个函数传递给被调用函数,只须把要传递的函数名作为实参即可。被调用函数的形参是接收函数入口地址的函数型指针。下面是指向函数的指针应用的实例。【例7-11】编写程序,利用指向函数的指针分别指向加、减、乘、除4 个函数,并实现加、减、乘、除的运算。上一页 返回 下一页任务5 指向函数的指针变量上一页 返回 下一页任务5 指向函数的指针变量上一页 返回 下一页任务5 指向函数的指针变量上一页 返回 下一页任务5 指向函数的指针变量上一页 返回任务6 指针变量作为函数参数【例7-12】返回 下一页任务6 指针变量作为函数参数 把上例中swap 函数改写成:程序运行情况如图7-4 所示。上
20、一页 返回任务7 指向结构体变量的指针 7.7.1 指向结构体类型变量的指针 1.指向结构体类型变量的指针变量 在程序中,如果设置了一个指针变量来专门存放一种结构体类型变量的地址,则该变量就是指向这种结构体类型数据的指针变量,该变量的值就是存放某个结构体类型数据的内存单元的起始地址。指向结构体类型数据的指针变量一般说明形式如下:返回 下一页任务7 指向结构体变量的指针 例如上一页 返回 下一页任务7 指向结构体变量的指针 2.利用指向结构体类型变量的指针变量引用 利用指向结构体类型的指针变量引用结构体变量成员的一般形式如下:例如上一页 返回 下一页任务7 指向结构体变量的指针“-”是指向结构体
21、成员运算符,“.”是取结构体成员运算符,它们的结合方式从左到右,优先级别最高。在程序中只能将结构体类型变量的地址赋给一个指向结构体类型的指针变量,一个指向结构体类型的指针变量只能指向结构体类型变量,不能指向变量的成员。上一页 返回 下一页任务7 指向结构体变量的指针 例7-13 指向结构体变量的指针的应用。上一页 返回 下一页任务7 指向结构体变量的指针上一页 返回 下一页任务7 指向结构体变量的指针 7.7.2 指向结构体类型数组的指针 在程序中,如果将一个结构体类型数组的地址赋给一个结构体类型的变量,那么该变量就是一个指向结构体类型数组的指针变量。可以利用该指针变量来引用数组元素的各个成员。例7-14 指向结构体数组的指针的应用。上一页 返回 下一页任务7 指向结构体变量的指针上一页 返回 下一页任务7 指向结构体变量的指针 注意:ps 是指向结构体类型数据的指针变量,只能将数组的地址或某个数组元素的地址赋给ps,不能将数组元素的成员或成员的地址赋给ps,否则,程序将会出错。上一页 返回图7-1 指针示意图返回图7-2 指针变量返回图7-3返回图7-4 程序运行示意图返回
限制150内