(中职)编程语言基础-C语言模块7教学课件_第1页
(中职)编程语言基础-C语言模块7教学课件_第2页
(中职)编程语言基础-C语言模块7教学课件_第3页
(中职)编程语言基础-C语言模块7教学课件_第4页
(中职)编程语言基础-C语言模块7教学课件_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

1、YCF正版可修改PPT(中职)编程语言基础C语言模块7教学课件模块7指针任务1 指针的概念任务2 指向简单变量的指针任务3 指针与数组任务4 指向字符串的指针变量任务5 指向函数的指针变量任务6 指针变量作为函数参数任务7 指向结构体变量的指针任务1指针的概念程序中的变量在运行时要占用内存单元,用来存放变量的内容。内存单元按顺序编号,称为内存地址,它相当于门牌号,系统根据内存地址存取数据。在C语言中,指针是一种数据类型,指针变量是用来专门存放所指对象地址的变量,也就是说,数据值是存放在指针所指的对象中,而不是在指针变量中。例如,我们定义了一个变量px,把x的地址1000存放在变量px中,通过p

2、x可以间接地访问x变量。px就是指向x的指针变量,px和它所指对象x的关系如图7-1所示。返回任务2指向简单变量的指针7.2.1 指针变量的定义指针变量在C语言中是一个重要的概念,指针变量定义的一般形式为:其含义是:指明标识符是存放某类型变量的地址变量,又称标识符为指向类型标识符的指定变量,简称标识符为指向类型标识符的指针。 例如int * px , x ;表明px是指向某一整型变量的指针变量。指针变量是一个变量,是存放地址的变量。设有一个指针变量px,若把变量x的地址赋给px,即:返回下一页任务2指向简单变量的指针则变量x的地址被放入指针变量px的存储空间中,其关系如图7-2所示。当指针得到

3、某一地址时,称该指针指向了那个地址的存储空间;指针指向的存储区域中的数据称为指针的目标。在程序中用“*”表示指针的目标,即:* px表示的是px的目标x。其实*px是一个运算表达式,也就是说:“*”是一个运算符,称为访问目标运算符,它只有一个运算量,而且必须是地址量。在对指针的实际运用中,经常会用到以下操作。对指针变量赋地址,即指针的初始化;利用指针可以间接访问变量。上一页返回下一页任务2指向简单变量的指针【例7-1】使用指针实现对变量的间接访问。上一页返回下一页任务2指向简单变量的指针7.2.2 指针的用途和用法由于指针是一种存放变量地址的特殊变量,因而为指针初始化的方法就是将1个变量的地址

4、赋给1个指针变量。(1)取地址运算符”&”。在C程序设计中,1个变量在内存中存放时具有确定的地址,但是对于程序设计者来说,具体地址是多少并不重要。使用取地址运算符”&”可以获得1个变量在内存中的地址。上一页返回下一页任务2指向简单变量的指针(2)将变量地址赋给指针。程序中的语句组”p=&a;q=&b;”的功能是把整型变量a、b的地址赋给指针变量p、q,这就是对指针变量的赋值操作。注意:对指针变量所赋的值一定是地址值。我们可以使用3种地址值:变量的地址:其表示方法为&变量名,如程序中&a和&b数组名:数组名表示数组的首地址。已经定向的指针:其中保存了1个变量的地址。上一页返回下一页任务2指向简单

5、变量的指针(3)取内容运算符“*”。在指针的前面添加“*”运算符可以获得该指针所指向变量的值,因此将“*”运算符称为取内容运算符。当将一个指针指向一个变量后,使用“*”可以实现对变量的间接访问。举例说明。上一页返回下一页任务2指向简单变量的指针使用间接访问的方法不但可以将数据读出,还可以将数据写入。注意:在指针定义语句中“*”只是一个指针标志符号,主要说明定义的变量为指针变量,不是取内容的运算符号,举例对比。上一页返回下一页任务2指向简单变量的指针正因为如此,可以在指针定义的同时对其进行定向,例如:(4)除了给指针赋1个确定的地址外还可以为指针赋1个空值,这时该指针并没有指向个确定的地址,例如

6、:上一页返回下一页任务2指向简单变量的指针(5)在C语言中,虽然在定义1个变量后系统就为该变量在内存中分配了一定大小的存储空间。但究竟此单元的地址是多少,用户是很难知道的。其实,在实际的操作中,通常并不需要知道1个变量在内存中的地址编号是多少,在程序中只需用相应的表达式表示出1个变量的地址即可,例如使用语句:上一页返回任务3指针与数组7.3.1 一维数组的指针和指向一维数组的指针变量1. 数组的指针与数组元素的指针数组元素的指针是指数组中某个具体元素的地址。数组的指针则是数组的首地址,也叫起始地址,是数组中最开头那个元素的地址。C语言程序中,数组名本身就代表该数组的首地址。返回下一页任务3指针

7、与数组2. 指向数组元素的指针变量的定义与赋值定义一个指向数组元素的指针变量的方法一般如下:注意:必须保证数组类型和指针变量所指向的变量类型保持一致。如果数组为int型,则指针变量应指向int型;如果数组为float型,则指针变量应指向float型。对指向数组的指针变量赋值有两种方法:将数组的地址赋给指针变量和将数组元素的地址赋给指针变量。上一页返回下一页任务3指针与数组3. 指针法引用数组元素假定:那么a代表数组a的首地址&a0 , p的值也是&a0 ,*p和*a则表示a0 。a+1的值是& a1 ,p+1的值也是& a1 ,*(a+1)和*(p+1)则表示 a1 a+i的值是&ai,p+i

8、的值也是&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-是非法的。因为a是数组名,代表首地址,在程序中是固定不变的,不能进行递增和递减运算。上一页返回下一页任务3指针与数组例7 -3用指针法输入输出数组元素的值。上一页返回下一页任务3指针

9、与数组例7-3的程序可以写成下面的指针法形式,其结果仍然不变。程序如下:上一页返回下一页任务3指针与数组例7-3的程序还可以写成下面的指针法形式,其结果也是不变的。上一页返回下一页任务3指针与数组7.3.2 内存的动态分配在C语言程序中,当定义任何一个类型数据对象时,程序都会自动分配足够的内存空间来存储这些数据,特别在处理较多的数据时,通常使用数组。数组具有静态性,必须在程序编译前确定数组的大小,不能在程序运行时根据数据的实际多少来确定数组的大小,那样往往造成内存资源的浪费,降低程序效率。对数据使用动态存储的一般步骤如下:确定需要多少内存空间一分配需要的存储空间一使指针指向获得的内存空间一用完

10、后释放掉这部分内存空间。上一页返回下一页任务3指针与数组1. malloc()函数作用:从堆中申请分配一个大小为size字节的内存块,函数使用完毕后,返回一个指针值,它指向新分配的内存块。如果堆不够分配,则返回的指针值为NULL。使用malloc()函数,必须将其头文件”stdlib. h”包含进来。在计算内存空间大小时,通常使用sizeof运算符来计算单个数据所需的字节数。上一页返回下一页任务3指针与数组上一页返回下一页任务3指针与数组上一页返回下一页任务3指针与数组2. calloc()函数作用:从堆中申请分配n个大小为size字节的连续内存块,函数使用完毕后,返回一个指针值,它指向新分配

11、的首个内存块。如果堆不够分配,则返回的指针值为NULL。使用calloc()函数,必须将其头文件”stdlib. h”包含进来。上一页返回下一页任务3指针与数组上一页返回下一页任务3指针与数组上一页返回下一页任务3指针与数组3. free()函数作用:释放指针变量P所指向的内存块。使用free()函数,必须将其头文件”stdlib. h”包含进来。上一页返回下一页任务3指针与数组上一页返回下一页任务3指针与数组4. realloc()函数realloc()函数的原型如下:作用:对已经申请成功的内存块进行缩小或扩大重新分配申请,使之大小变为size字节,函数使用完毕后,返回一个指针值,它指向重新

12、分配的内存块,如果重新分配申请不成功,则返回的指针值为NULL。使用rallot()函数,必须将其头文件”stdlib. h”包含进来。上一页返回下一页任务3指针与数组上一页返回下一页任务3指针与数组上一页返回下一页任务3指针与数组7.3.3 二维数组的指针和指向二维数组的指针变量指针变量可以指向一维数组,也可以指向二维数组,下面介绍二维数组的指针及指向二维数组的指针变量的一些基本概念和使用方法。1. 二维数组的指针与地址。二维数组的指针就是二维数组的地址。假定有一个二维数组如下:上一页返回下一页任务3指针与数组可以得出以下结论上一页返回下一页任务3指针与数组2. 指向二维数组的指针变量C语言

13、程序中,一个指针变量可以指向二维数组的某一行(指向一维数组),也可以指向二维数组中的某一个元素(指向具体数据)。如果一个指针变量指向二维数组中的某一个元素,该二维数组可以通过元素相对地址的转换计算,用一维数组的方法来处理。例7 -4用指向某一元素的指针变量输出二维数组中的元素值。上一页返回下一页任务3指针与数组上一页返回下一页任务3指针与数组例7-5用指向二维数组某一行的指针变量输出二维数组中的元素值。上一页返回下一页任务3指针与数组例7-6一个班有3个学生,各学4门功课,计算其平均分及第n个学生的成绩。上一页返回下一页任务3指针与数组上一页返回下一页任务3指针与数组上一页返回任务4指向字符串

14、的指针变量7.4.1 字符串的表示形式在C语言中,没有专门存放字符串的变量,一个字符串可以放在一个字符数组中,数组名就表示该字符串中第一个字符存放的地址,也可以将字符串的首地址赋给一个字符型指针变量,该指针变量便指向这个字符串。例如:返回下一页任务4指向字符串的指针变量【例7-7】用字符数组来处理字符串。上一页返回下一页任务4指向字符串的指针变量【例7-8】用字符串指针来实现处理字符串。上一页返回下一页任务4指向字符串的指针变量说明:(1)首先定义指针变量str,并使其指向字符串“I love China !”的首地址。(2)在printf( % sn, str)语句中,系统从str所指向的地

15、址输出一个字符串,即输出:I love China!(3)在for循环语句中,条件判断语句判断字符串是否结束,循环体中的语句是输出当前的str所指向的字符,输出之后str进行加1,指向需要处理的下一个字符。上一页返回下一页任务4指向字符串的指针变量【例7-9】输出字符串中n个字符之后的所有字符。上一页返回下一页任务4指向字符串的指针变量【例7-10】使用字符指针,把一个字符串的内容复制到另一个字符串中。分析:将字符串a的内容复制到另一个字符串b中的方法是从a的第一个元素开始逐个复制到b中,一直到最后一个元素。特别注意,一定要把字符串的结束标志复制到b中。上一页返回下一页任务4指向字符串的指针变

16、量上一页返回下一页任务4指向字符串的指针变量7.4.2 字符串指针变量与字符数组的区别从上面的例子可以看出,使用字符数组和字符指针变量都可实现字符串的存储和运算。两者既有相同之处,又有区别。在使用时应注意以下几个问题:(1)字符数组是由若干个字符元素组成的,它可用来存放整个字符串。字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该指针变量为首地址的一块连续的内存空间。(2)赋值方式不同。字符串赋给字符数组只能在初始化的时候进行,即上一页返回下一页任务4指向字符串的指针变量这是因为字符数组定义之后,只能对字符数组的各元素逐个赋值。对于字符指针:上一页返回任务5指向函数

17、的指针变量7.5.1 函数的指针前面介绍指针概念的最终目标都是要处理数据,所以称它们为数据指针。在C语言中,指针除了可以保存数据的存储地址外,还可以保存函数存储的首地址(即函数的执行入口地址)。指针变量持有函数的入口地址时,它就指向了该函数,称这种指针为指向函数的指针。函数的指针在程序中的说明形式如下。上一页返回下一页任务5指向函数的指针变量注意以下几点问题。(1)圆括号不能省。(2)存储类型是函数指针本身的存储类型。(3)数据类型是指针指向的函数具有的数据类型。(4)函数名具有该函数的存储首地址,即函数的执行入口地址。例如,在程序中定义了如下函数:上一页返回下一页任务5指向函数的指针变量7.

18、5.2 指向函数的指针的应用指向函数的指针的主要用途是在函数之间实现函数传递。函数传递实质上是函数地址的传递。在函数调用中,如果想在调用函数中把一个函数传递给被调用函数,只须把要传递的函数名作为实参即可。被调用函数的形参是接收函数入口地址的函数型指针。下面是指向函数的指针应用的实例。【例7-11】编写程序,利用指向函数的指针分别指向加、减、乘、除4个函数,并实现加、减、乘、除的运算。上一页返回下一页任务5指向函数的指针变量上一页返回下一页任务5指向函数的指针变量上一页返回下一页任务5指向函数的指针变量上一页返回下一页任务5指向函数的指针变量上一页返回任务6指针变量作为函数参数【例7-12】返回下一页任务6指针变量作为函数参数把上例中swap函数改写成:程序运行情况如图7-4所示。上一页返回任务7指向结构体变量的指针7.7.1 指向结构体类型变量的指针1. 指向结构体类型变量的指针变量在程序中,如果设置了一个指针变量来专门存放一种结构体类型变量的地址,则该变量就是指向这种结构体类型数据的指针变量,该变量的值就是存放某个结构体类型数据的内存单元的起始地

温馨提示

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

评论

0/150

提交评论