书签 分享 收藏 举报 版权申诉 / 51
上传文档赚钱

类型指针-PPT课件(同名215).ppt

  • 上传人(卖家):三亚风情
  • 文档编号:2729582
  • 上传时间:2022-05-22
  • 格式:PPT
  • 页数:51
  • 大小:320.50KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《指针-PPT课件(同名215).ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    指针 PPT 课件 同名 215
    资源描述:

    1、指针是指针是C C语言中的一个概念,正确而灵活地语言中的一个概念,正确而灵活地运用指针,可以有效地表示复杂的数据结构、运用指针,可以有效地表示复杂的数据结构、难动态分配内存、方便使用字符串和数组、能难动态分配内存、方便使用字符串和数组、能使函数返回一个以上的结果、能直接使用内存使函数返回一个以上的结果、能直接使用内存地址等。地址等。本章内容包括:本章内容包括:10.1 10.1 地址和指针的概念地址和指针的概念10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 10.3 10.3 数组与指针数组与指针10.4 10.4 字符串与指针字符串与指针10.5 10.5

    2、指向函数的指针指向函数的指针10.6 10.6 返回指针值的函数返回指针值的函数10.7 10.7 指针数组与指向指针的指针指针数组与指向指针的指针10.1地址和指针的概念地址和指针的概念一、指针概述:一、指针概述:1 1、地址的概念与取地址运算地址的概念与取地址运算: 内存以字节编码,每个编码都是一个地址。我们原先学过的内存以字节编码,每个编码都是一个地址。我们原先学过的变量、数组、函数等都放在内存中,在程序中,我们是通过变量变量、数组、函数等都放在内存中,在程序中,我们是通过变量名等使用变量、给变量赋值等,但实际运行时,系统使用的是内名等使用变量、给变量赋值等,但实际运行时,系统使用的是内

    3、存地址,而不是变量名。我们怎样知道机器将某种数据放在内存存地址,而不是变量名。我们怎样知道机器将某种数据放在内存的什么地方呢?可用求地址运算符的什么地方呢?可用求地址运算符& & 如:如:int int a = 3 ; &a a = 3 ; &a 就是变量在内存中的地址。就是变量在内存中的地址。 可以用可以用printfprintf(“%x n” , &a); (“%x n” , &a); 看出其地址。看出其地址。注意,这个注意,这个地址并不是始终不变的,这是由机器和操作系统来安排的,我们地址并不是始终不变的,这是由机器和操作系统来安排的,我们无法预先知道。无法预先知道。 在数组中,数组名代表

    4、数组的首地址在数组中,数组名代表数组的首地址 故故a表示的地址和表示的地址和&a 0的地址相同。的地址相同。 但但&不能施加在常数、常量或表达式上,也不能施加在寄存器变量上不能施加在常数、常量或表达式上,也不能施加在寄存器变量上(因为寄存器变量在(因为寄存器变量在cpu中,不在内存中)。中,不在内存中)。二、指针变量:二、指针变量: 既然存储在内存中的各种变量都有一个地址,我们能否这样设想:定既然存储在内存中的各种变量都有一个地址,我们能否这样设想:定义某种变量,让这个变量的值等于某个变量的地址,如同某个房间号、义某种变量,让这个变量的值等于某个变量的地址,如同某个房间号、门牌号一样?回答是肯

    5、定的。我们把门牌号一样?回答是肯定的。我们把这种存放某种变量地址的变量称为这种存放某种变量地址的变量称为指针变量。指针变量。 1035.ab20102012p2010q2012因此,在因此,在C语言中,将地语言中,将地址形象化地称为址形象化地称为指针指针说明说明(系统对变量的访问形式分为两种系统对变量的访问形式分为两种)一个变量的访问(访问是指取出其值或向它赋值)方式一个变量的访问(访问是指取出其值或向它赋值)方式有两种:有两种:(1)直接访问,通过变量名访问,如通过变量名)直接访问,通过变量名访问,如通过变量名i直接访直接访问。问。(2)间接访问,通过该变量的指针来访问,如通过)间接访问,通

    6、过该变量的指针来访问,如通过指针指针p访问变量访问变量i。 1.1.内存地址内存地址内存中存储单元的编号内存中存储单元的编号(1 1)计算机硬件系统的内存储器中,拥有大量的存储)计算机硬件系统的内存储器中,拥有大量的存储单元(容量为字节)。单元(容量为字节)。为了方便管理,必须为每一个存储单元编号,这个编为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的号就是存储单元的 地址地址 。每个存储单元都有一个惟。每个存储单元都有一个惟一的地址。一的地址。(2 2)在地址所标识的存储单元中存放数据。)在地址所标识的存储单元中存放数据。注意:内存单元的地址与内存单元中的数据是两个完注意:内存

    7、单元的地址与内存单元中的数据是两个完全不同的概念。全不同的概念。2.2.指针指针即地址即地址 一个变量的地址称为该变量的指针。通过变量的指针一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量能够找到该变量2.2.变量地址变量地址系统分配给变量的内存单元的起始地系统分配给变量的内存单元的起始地址。址。假设有这样一个程序:假设有这样一个程序:main()main() int i; int i; scanf(%d,&i); scanf(%d,&i); printf printf(i=%dn, i);(i=%dn, i); C C编译程序编译到该变量定义语句时,将变量编译程序编译到该变量定义

    8、语句时,将变量i i 登录到登录到 符号表符号表 中。符号表的关键属性有两个:一是中。符号表的关键属性有两个:一是 标识符名(标识符名(idid) ,二,二是该标识符在内存空间中的是该标识符在内存空间中的 地址(地址(addraddr) 。为描述方便,假设系统分配给变量为描述方便,假设系统分配给变量i i的的2 2字节存储单元为字节存储单元为 2000 2000 和和20012001,则起始地址,则起始地址20002000就是变量就是变量i i在内存中的地址。在内存中的地址。3.3.变量值的存取变量值的存取通过变量在内存中的地址进行通过变量在内存中的地址进行系统执行系统执行 scanfscan

    9、f(%d,&i);(%d,&i);和和 printfprintf(i=%dn, i);(i=%dn, i);时,时,存取变量存取变量i i值的方式可以有两种:值的方式可以有两种:(1)(1)直接访问直接访问直接利用变量的地址进行存取直接利用变量的地址进行存取 1)1)上例中上例中scanfscanf(%d,&i)(%d,&i)的执行过程是这样的:的执行过程是这样的: 用变量名用变量名i i作为索引值,检索符号表,找到变量作为索引值,检索符号表,找到变量i i的的起始地址起始地址20002000;然后将键盘输入的值(假设为)送;然后将键盘输入的值(假设为)送到内存单元到内存单元20002000和

    10、和20012001中。此时,变量中。此时,变量i i在内存中的地在内存中的地址和值,如图址和值,如图10-110-1所示。所示。 2 2)printfprintf(i=%dn,i)(i=%dn,i)的执行过程,与的执行过程,与scanfscanf()()很很相似:相似: 首先找到变量首先找到变量i i的起始地址的起始地址20002000,然后从,然后从20002000和和20012001中取出其值,最后将它输出。中取出其值,最后将它输出。 (2 2)间接访问间接访问通过另一变量访问该变量的值通过另一变量访问该变量的值 语言规定:在程序中可以定义一种特殊的变量(称语言规定:在程序中可以定义一种特

    11、殊的变量(称为指针变量),用来存放其它变量的地址。为指针变量),用来存放其它变量的地址。例如,假设定义了这样一个指针变量例如,假设定义了这样一个指针变量i_pointeri_pointer,它被分配到,它被分配到30103010、30113011单元,其值可通过赋值语句单元,其值可通过赋值语句i_pointer=i_pointer=i;i;得到。得到。此时,指针变量此时,指针变量i_pointeri_pointer的值就是变量的值就是变量i i在内存中的起始地址在内存中的起始地址20002000,如图,如图10-110-1所示。所示。通过指针变量通过指针变量i_pointeri_pointer

    12、存取变量存取变量i i值的过程如下:值的过程如下:首先找到指针变量首先找到指针变量i_pointeri_pointer的地址(的地址(30103010),取出其值),取出其值20002000(正好是变量(正好是变量i i 的起始地址)的起始地址); ; 然后从然后从20002000、20012001中取出变量中取出变量i i的值(的值(3 3)。)。 (3 3)两种访问方式的比较)两种访问方式的比较 两种访问方式之间的关系,可以用某人甲(系统)要找某人乙两种访问方式之间的关系,可以用某人甲(系统)要找某人乙(变量)来类比。(变量)来类比。一种情况是,甲知道乙在何处,直接去找就是(即直接访问)。

    13、一种情况是,甲知道乙在何处,直接去找就是(即直接访问)。另一种情况是,甲不知道乙在哪,但丙(指针变量)知道,此另一种情况是,甲不知道乙在哪,但丙(指针变量)知道,此时甲可以这么做:先找丙,从丙处获得乙的去向,然后再找乙时甲可以这么做:先找丙,从丙处获得乙的去向,然后再找乙(即间接访问)。(即间接访问)。10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量(1 1)指针)指针即地址即地址 一个变量的地址称为该变量的指针。通过变量的指针能够找到一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。该变量。(2 2)指针变量)指针变量专门用于存储其它变量地址的变量专门用于存

    14、储其它变量地址的变量指针变量指针变量i_pointeri_pointer的值就是变量的值就是变量i i的地址。指针与指针变量的的地址。指针与指针变量的区别,就是变量值与变量的区别。区别,就是变量值与变量的区别。(3 3)为表示指针变量和它指向的变量之间的关系,用指针运算)为表示指针变量和它指向的变量之间的关系,用指针运算符符 * * 表示。表示。 例如,指针变量例如,指针变量i_pointeri_pointer与它所指向的变量与它所指向的变量i i的关系,表示为:的关系,表示为:* *i_pointeri_pointer,即,即* *i_pointeri_pointer等价于变量等价于变量i

    15、i。因此,下面两个语句的作用相同:因此,下面两个语句的作用相同:i=3;i=3; / /* *将将3 3直接赋给变量直接赋给变量i i* */ /i_pointer=&i; /i_pointer=&i; /* *使使i_pointeri_pointer指向指向i i * */ /* *i_pointer=3;i_pointer=3; / /* *将将3 3赋给指针变量赋给指针变量i_pointeri_pointer所指向所指向的变量的变量* */ /10.2.1定义一个指针变量定义一个指针变量指针变量的定义一般形式为:指针变量的定义一般形式为:基类型基类型*指针变量名指针变量名;例如:例如:i

    16、nt i, j, int i, j, * *pi, pi, * *pjpj; ; float x, y, float x, y, * *p1, p1, * *p2;p2;指针变量的赋值:使得指针变量指向变量指针变量的赋值:使得指针变量指向变量指针变量名指针变量名& &变量名变量名; ;如:如: pi=&i; pjpi=&i; pj=&j; p1=&y; p2=&x;=&j; p1=&y; p2=&x;注意:指针变量只能存放指针(地址),且只能是相同类型变量注意:指针变量只能存放指针(地址),且只能是相同类型变量的地址。的地址。例如,指针变量例如,指针变量pipi、pjpj,只能接收,只能接收i

    17、ntint型、型、p1, p2p1, p2只能接收只能接收floatfloat型的地址,否则出错型的地址,否则出错。10.2.2指针变量的引用在程序中,可以用:在程序中,可以用:*指针变量名代替其所指变量。如若指针变量名代替其所指变量。如若int i, *p; p=&i;则则 i=5;与与*p=5;的作用相同,即可用的作用相同,即可用*p代替代替i,这里这里*号称为指号称为指针运算符(或称为间接访问运算符)针运算符(或称为间接访问运算符)例例10.1通过指针变量访问整型变量通过指针变量访问整型变量main()int a, b, point_1, point_2;a=100; b=10;poin

    18、t_1=&a; point_2=&b;printf(n%d,%dn,a,b);printf(%d,%d,*point_1,*point_2);例例10.2输入输入a和和b两个整数,按先大后小的顺序输出两个整数,按先大后小的顺序输出a和和b的值的值main()int a, b, *p, *p1, *p2;p1=&a;p2*=&b;scanf(%d%d,p1,p2);if(ab) p=p1;p1=p2;p2=p;printf(a=%d,b=%dn,a,b);printf(max=%d,min=%d,*p1,*p2);getch();10.2.3 指针变量作为函数参数实参:变量地址或已赋值的指针变量

    19、,形参:指针变量实参:变量地址或已赋值的指针变量,形参:指针变量功能:地址传送方式,会将改变后的值带回。功能:地址传送方式,会将改变后的值带回。例例10.3通过函数调用实现例通过函数调用实现例10.2的功能。的功能。swap(int *p1, int *p2)int temp;temp=*p1; *p1=*p2; *p2=temp;main()int a, b, *pointer1,*pointer2;scanf(%d%d,&a,&b);pointer1=&a; pointer2=&b;if(ab) swap(&a,&b);printf(n%d,%d,a,b);例例10.4输入输入3个整数,按

    20、降序(从大到小的顺序)输出。要求使用变量个整数,按降序(从大到小的顺序)输出。要求使用变量的指针作函数调用的实参来实现。的指针作函数调用的实参来实现。void exchange(int *pointer1, int *pointer2) int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; main() int a,b,c; printf(Input the first number: ); scanf(%d, &a); printf(Input the second number: ); scanf(%d, &b); p

    21、rintf(Input the third number: ); scanf(%d, &c); printf(a=%d, b=%d, c=%dn, a, b, c); /*排序排序*/ if( a b ) /*ab*/ exchange( &a, &b ); if( a c ) exchange( &a, &c ); if( b c ) exchange( &b, &c ); printf(排序结果排序结果: %d, %d, %dn,a,b,c); getch(); 10.3数组与指针10.3.1指向数组元素的指针指向数组元素的指针1.概念概念数组的指针数组的指针数组在内存中的起始地址,数组元

    22、素的指针数组在内存中的起始地址,数组元素的指针数组元素在内存中的起始地址。数组元素在内存中的起始地址。2.指向数组的指针变量的定义指向数组的指针变量的定义指向数组的指针变量的定义,与指向普通变量的指针变量的定指向数组的指针变量的定义,与指向普通变量的指针变量的定义方法一样。义方法一样。例如,例如,int a 10, *p=a (或或&a 0);或者:或者: int a 10, *p; pa;注意注意:数组名代表数组在内存中的起始地址(与第:数组名代表数组在内存中的起始地址(与第1个元素的地个元素的地址相同),所以可以用数组名给指针变量赋值址相同),所以可以用数组名给指针变量赋值3.3.数组元素

    23、的引用数组元素的引用数组元素的引用,既可用下标法,也可用指针法。使用下标法,数组元素的引用,既可用下标法,也可用指针法。使用下标法,直观;而使用指针法,能使目标程序占用内存少、运行速度快。直观;而使用指针法,能使目标程序占用内存少、运行速度快。10.3.2 10.3.2 通过指针引用数组元素通过指针引用数组元素如果有如果有“intint a 10, a 10,* *p=a;” p=a;” ,则:,则:(1 1)p+ip+i和和a+ia+i都是数组元素都是数组元素a ia i的地址,如图的地址,如图10.1310.13所示。所示。 (2 2)* *(p+i)(p+i)和和* *(a+i)(a+i

    24、)就是数组元素就是数组元素a ia i。(3 3)指向数组的指针变量,也可将其看作是数组名,因而可按)指向数组的指针变量,也可将其看作是数组名,因而可按下标法来使用。例如,下标法来使用。例如,pipi等价于等价于* *( (p+i)p+i)。注意注意:p+1p+1指向数组的下一个元素,而不是简单地使指针变量指向数组的下一个元素,而不是简单地使指针变量p p的值的值+1+1。其实际变化为。其实际变化为p+1p+1* *size(sizesize(size为一个元素占用的字节为一个元素占用的字节数)。数)。例 如 , 假 设 指 针 变 量例 如 , 假 设 指 针 变 量 p p 的 当 前 值

    25、 为的 当 前 值 为 3 0 0 03 0 0 0 , 则, 则 p + 1p + 1 为为3000+13000+1* *2=30022=3002,而不是,而不是30013001例例10.5输出数组的全部元素输出数组的全部元素法一:下标法 main()int a10,i;for(i=0;i10;i+) scanf(%d,&ai);printf(n);for(i=0;i10;i+) printf(%5d,ai);getch();法二:用数组名计算数组元素地址main()int a10,i;for(i=0;i10;i+) scanf(%d,&ai);printf(n);for(i=0;i10;i

    26、+) printf(%5d,*(ai);getch();法三:用指针变量指向数组元素main()int a10,i, *p;for(i=0;i10;i+) scanf(%d,&ai);printf(n);for(p=a;pa+10;p+) printf(%5d,*p);getch();说明:说明: (1 1)指针变量的值是可以改变的,所以必须注意其当前值,)指针变量的值是可以改变的,所以必须注意其当前值,否则容易出错。否则容易出错。 (2 2)指向数组的指针变量,可以指向数组以后的内存单元,)指向数组的指针变量,可以指向数组以后的内存单元,虽然没有实际意义。虽然没有实际意义。 (3 3)对指向

    27、数组的指针变量()对指向数组的指针变量(pxpx和和pypy)进行算术运算和)进行算术运算和关系运算的含义关系运算的含义 1 1)可以进行的算术运算,只有以下几种:)可以进行的算术运算,只有以下几种: pxpxn, px+/+px, px-/-px, px-pyn, px+/+px, px-/-px, px-pypxpxn n:将指针从当前位置向前(:将指针从当前位置向前(+n+n)或回退()或回退(-n-n)n n个数据单个数据单位,而不是位,而不是n n个字节。显然,个字节。显然,px+/+pxpx+/+px和和px-/-pxpx-/-px是是pxpxn n的的特例(特例(n=1n=1)。

    28、)。 px-pypx-py:两指针之间的数据个数,而不是指针的地址:两指针之间的数据个数,而不是指针的地址之差。之差。2 2)关系运算)关系运算表示两个指针所指地址之间、位置的前后关系:前者为小,后表示两个指针所指地址之间、位置的前后关系:前者为小,后者为大。者为大。例如,如果指针例如,如果指针pxpx所指地址在指针所指地址在指针pypy所指地址之前,则所指地址之前,则pxpxpypy的的值为值为1 1。10.3.3 10.3.3 用数组名作为函数参数用数组名作为函数参数数组名作形参时,接收实参数组的起始地址;作实参时,将数组名作形参时,接收实参数组的起始地址;作实参时,将数组的起始数组的起始

    29、地址传递给形参数组。地址传递给形参数组。引入指向数组的指针变量后,数组及指向数组的指针变量作引入指向数组的指针变量后,数组及指向数组的指针变量作函数参数时,函数参数时,可有种等价形式(本质上是一种,即指针数据作函数参数):可有种等价形式(本质上是一种,即指针数据作函数参数):(1 1)形参、实参都用数组名)形参、实参都用数组名(2 2)形参、实参都用指针变量)形参、实参都用指针变量(3 3)形参用指针变量、实参用数组名)形参用指针变量、实参用数组名(4 4)形参用数组名、实参用指针变量)形参用数组名、实参用指针变量例10.7将数组a中的n个整数按相反次序存放void inv(int x, in

    30、t n)int temp,i,j,m=(n-1)/2;for(i=0;i=m;i+) j=n-i-1; temp=xi; xi=xj; xj=temp; main()int i, a10=0,1,2,3,4,5,6,7,8,9;for(i=0;i10;i+) printf(%5d,ai);printf(n);inv(a,10);for(i=0;i10;i+) printf(%5d,ai);getch();void inv(int *x, int n)int temp,*i,*j,*p,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)temp=*i; *i=

    31、*j; *j=temp; main()int i, a10=0,1,2,3,4,5,6,7,8,9;for(i=0;i10;i+) printf(%5d,ai);printf(n);inv(a,10);for(i=0;i10;i+) printf(%5d,ai);作业:作业:10.1,10.2,10.310.3.4 多维数组与指针多维数组与指针 1. 多维数组元素的地址多维数组元素的地址 假设有如下数组定义语句:假设有如下数组定义语句: int a 34;(1)从)从2维数组角度看,数组名维数组角度看,数组名a代表数组的起始地址,代表数组的起始地址, 是一是一个以行为单位进行控制的行指针:个以

    32、行为单位进行控制的行指针: a+i:行指针值,指向:行指针值,指向2维数组的第维数组的第i行。行。 *(a+i):(列)指针值:(列)指针值(&ai0),指向第,指向第i行第列(控行第列(控制由行转为列,但仍为指针)。制由行转为列,但仍为指针)。 *(*(a+i):数组元素:数组元素a i0的值。的值。 用用a作指针访问数组元素作指针访问数组元素a ij的格式:的格式: *(*(a+i)j)(2)从)从1维数组角度看,数组名维数组角度看,数组名a和第和第1维下标的每一个值,维下标的每一个值, 共共同构成一组新的同构成一组新的1维数组名维数组名a 0、a 1、a 2,它们均由,它们均由4个个元素

    33、组成。元素组成。语言规定:语言规定:数组名代表数组的地址数组名代表数组的地址,所以,所以a ia i是第是第i i行行1 1维数维数组的地址,组的地址, 它指向该行的第它指向该行的第0 0列元素,是一个以数组元素为列元素,是一个以数组元素为单位进行控制的列指针:单位进行控制的列指针:ai+jai+j:(列)指针值,指向数组元素:(列)指针值,指向数组元素a ija ij。* *(ai+j)(ai+j):数组元素:数组元素a ija ij的值。的值。如果有如果有“int a34,int a34,* *p=a 0p=a 0;”,则,则p+1p+1指向下一个元素,指向下一个元素,用用p p作指针访问

    34、数组元素作指针访问数组元素a ija ij的格式:的格式: * *(p+(p+(* *每行列数每行列数+j) )+j) )a+i 即即 aiai+j即即&aij*(a+i)+j即即 &ai0+j即即&aij*(*(a+i)+j)即即aij2,指向多维数组元素的指针变量,指向多维数组元素的指针变量(1 1)指向数组元素的指针变量)指向数组元素的指针变量例例10.1110.11用指针变量输出数组元素的值用指针变量输出数组元素的值#include#includevoid main()void main()int a34=1,3,5,7,9,11,13,15,17,19,21,23;int a34=1

    35、,3,5,7,9,11,13,15,17,19,21,23;int int * *p;p;for(p=a0;pa0+12;p+)for(p=a0;pa0+12;p+) if(p-a0)%4=0)printf(n); if(p-a0)%4=0)printf(n); printf(%4d, printf(%4d,* *p);p); 例例10.1110.11输出二维数组的任一行任一列的值输出二维数组的任一行任一列的值#includevoid main()int a34=1,3,5,7,9,11,13,15,17,19,21,23;int (*p)4,i,j;/定义一个指向含有定义一个指向含有4个元素

    36、的整型数组个元素的整型数组p=a;scanf(i=%d,j=%d,&i,&j);printf(a%d,%d=%dn,i,j,*(*(p+i)+j);3.指向数组的指针作为函数参数指向数组的指针作为函数参数例例10.13有一个班,有一个班,3个学生,各学个学生,各学4门课程,计算总门课程,计算总1平均分平均分数及输出第数及输出第n个学生的成绩。个学生的成绩。算法设计:算法设计:主函数:主函数:1,函数声明,函数声明2,初始化成绩,初始化成绩3,调用求平均成绩的函数,调用求平均成绩的函数4,调用函数输出第,调用函数输出第i个学生的成绩个学生的成绩求平均值函数:求平均值函数:1,求总成绩,求总成绩2

    37、,返回平均成绩,返回平均成绩输出函数输出函数使用使用for循环,直接输出成绩循环,直接输出成绩#includevoid main( ) void average(float *p,int n); void search(float (*p)4, int n); float score34=65,67,70,60,80,87,90,81,90,99,100,98; average(*score,12); search(score,2);void average(float *p,int n) float *p_end; float sum=0,aver; p_end=p+n-1; for(;p=

    38、p_end;p+) sum=sum+(*p);aver=sum/n;printf(average=%5.2f,aver);void search(float (*p)4, int n) int i; printf(The score of NO:%dn,n); for(i=0;i4;i+) printf(%5.2f,*(*(p+n)+i);10.4 字符串与指针10.4.1字符串的表示形式字符串的表示形式1,用数组存放一个字符串,用数组存放一个字符串例例10.15定义一个字符数组,对它进行初始化,然后输出该定义一个字符数组,对它进行初始化,然后输出该字符串。字符串。#includevoid m

    39、ain()char string=I love China);printf(%s,string);2,用字符指针指向一个字符串。用字符指针指向一个字符串。例例10.16#includevoid main()char *string=I love China; printf(%s,string);10.4.2 字符串指针作为函数参数字符串指针作为函数参数例例10.20用函数调用实现字符串的复制用函数调用实现字符串的复制#includevoid copy_string (char *from, char *to) for(; (*to=*from)!=0; from+, to+) ; void m

    40、ain() void copy_string (char *from, char *to); char array_str120=I am a teacher.; char array_str220; copy_string(array_str1, array_str2); /*数组名作实参数组名作实参*/ printf(array_str2=%sn, array_str2); 程序说明:程序说明: for(; (*to=*from)!=0; from+, to+) ; 语句的执行过程为:首先将源串中的当前字符,复制到语句的执行过程为:首先将源串中的当前字符,复制到目标串中;然后判断该字符(即

    41、赋值表达式的值)是否是结目标串中;然后判断该字符(即赋值表达式的值)是否是结束标志。如果不是,则相对位置变量束标志。如果不是,则相对位置变量i的值增的值增1,以便复制下,以便复制下一个字符;如果是结束标志,则结束循环。其特点是:先复一个字符;如果是结束标志,则结束循环。其特点是:先复制、后判断,循环结束前,结束标志已经复制。制、后判断,循环结束前,结束标志已经复制。 在在C语言中,用赋值运算符、而不是赋值语句来实现赋语言中,用赋值运算符、而不是赋值语句来实现赋值操作,能给某些处理带来很大的灵活性,该语句(实现字值操作,能给某些处理带来很大的灵活性,该语句(实现字符串的复制)的用法就是最好的例证

    42、。符串的复制)的用法就是最好的例证。10.5 指向函数的指针指向函数的指针1.1.函数指针的概念函数指针的概念 一个函数在编译时,被分配了一个入口地址,这个地址就一个函数在编译时,被分配了一个入口地址,这个地址就称为该函数的指针。称为该函数的指针。可以用一个指针变量指向一个函数,然后通过该指针变量调用此函可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。数。 2.2.指向函数的指针变量指向函数的指针变量 (1 1)定义格式)定义格式 函数类型函数类型 ( (* *指针变量指针变量)( )( ); 注意:注意:“* *指针变量指针变量”外的括号不能缺,否则成了返回指针值的函外的括号不

    43、能缺,否则成了返回指针值的函数。数。 例如,例如,int (int (* *fp)(); /fp)(); /* * fp fp为指向为指向intint函数的指针变量函数的指针变量* */ / (2 2)赋值)赋值 函数名代表该函数的入口地址。因此,可用函数名给指向函数的函数名代表该函数的入口地址。因此,可用函数名给指向函数的指针变量赋值。指针变量赋值。 指向函数的指针变量指向函数的指针变量&函数名函数名; ; 注意:函数名后不能带括号和参数;函数名前的注意:函数名后不能带括号和参数;函数名前的“&”&”符号是可选符号是可选的。的。(3)调用格式调用格式 (*函数指针变量函数指针变量)(实参表实

    44、参表)3.指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量的常用用途之一,就是将函数指针作参数,指向函数的指针变量的常用用途之一,就是将函数指针作参数,传递到其它函数。传递到其它函数。注意:对指向函数的指针变量,诸如注意:对指向函数的指针变量,诸如p+i、p+/p-等运算是没有等运算是没有意义的。意义的。例例10.24设有一个函数设有一个函数process,在调用它时,每次实现不同的,在调用它时,每次实现不同的功能。输入功能。输入a和和b两个数,第一次调用时找出两个数,第一次调用时找出a与与b中的大者,第中的大者,第二次找出小者,第三次求和。二次找出小者,第三次求和。

    45、#includevoid main()int max(int,int);int min(int,int);int add(int,int);int process(int, int, int (*fun)();int a,b;printf(enter a and b:);scanf(%d%d,&a,&b);printf(nmax=);process(a,b,max);printf(nmin=);process(a,b,min);printf(nsum=);process(a,b,add);max(int x, int y)return xy?x:y;min(int x, int y)retur

    46、n xy?y:x;add(int x, int y)return x+y;process(int x, int y, int (*fun)(int,int) /*fun是一个指向函数是一个指向函数的指针,该函数是一个有两个整型参数的返回整型值的函数的指针,该函数是一个有两个整型参数的返回整型值的函数*/int result;result=(*fun)(x,y);printf(%dn,result);作业作业10.4,10.5要求相应的写出算法要求相应的写出算法10.6 返回指针值的函数返回指针值的函数一个函数可以返回一个一个函数可以返回一个intint型、型、floatfloat型、型、cha

    47、rchar型的数据,也可以返回一个指针类型的数型的数据,也可以返回一个指针类型的数据。据。 返回指针值的函数(简称指针函数)的定返回指针值的函数(简称指针函数)的定义格式如下:义格式如下: 函数类型函数类型 * *函数名函数名( (形参表列形参表列) )例如:例如:int int * *a(int x,int y);a(int x,int y);该函数的函数名为该函数的函数名为a a,返回的是一个整型的指针。,返回的是一个整型的指针。例例10.2410.24有若干个学生的成绩(每个学生有有若干个学生的成绩(每个学生有4 4门课程)要求在门课程)要求在输入学生序号后,能输出该学生的全部成绩输入学

    48、生序号后,能输出该学生的全部成绩#include#includevoid main()void main()float float score4=60,70,80,90,56,89,67,88,34,78,90,66;score4=60,70,80,90,56,89,67,88,34,78,90,66;float float * *search(float (search(float (* *point)4,int n);point)4,int n);float float * *p;p;int i,m;int i,m;printf(printf(请输入学生的序号请输入学生的序号:);:);s

    49、canf(%d,&m);scanf(%d,&m);printf(printf(序号为序号为%d%d的学生的成绩:的学生的成绩:n,m);n,m);p=search(score,m);p=search(score,m);for(i=0;i4;i+)for(i=0;i4;i+)printf(%5.2ft,printf(%5.2ft,* *(p+i);(p+i);printf(n);printf(n); float float * *search(float (search(float (* *pointer)4,int n)pointer)4,int n) float float * *pt;pt

    50、;pt=pt=* *(pointer+n);(pointer+n);return(pt);return(pt); 例例10.2510.25对上例中的学生,找出其中不及格课程的学生及其学生号对上例中的学生,找出其中不及格课程的学生及其学生号. .#include#includevoid main()void main()float float score4=60,70,80,90,56,89,67,88,34,78,90,66;score4=60,70,80,90,56,89,67,88,34,78,90,66;float float * *search(float (search(float

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:指针-PPT课件(同名215).ppt
    链接地址:https://www.163wenku.com/p-2729582.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库