C语言入门学习-C第10章-指针课件.ppt

上传人:飞****2 文档编号:82444971 上传时间:2023-03-25 格式:PPT 页数:81 大小:661KB
返回 下载 相关 举报
C语言入门学习-C第10章-指针课件.ppt_第1页
第1页 / 共81页
C语言入门学习-C第10章-指针课件.ppt_第2页
第2页 / 共81页
点击查看更多>>
资源描述

《C语言入门学习-C第10章-指针课件.ppt》由会员分享,可在线阅读,更多相关《C语言入门学习-C第10章-指针课件.ppt(81页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第十章第十章C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 2l l 主要内容 10.1 10.1地址和指针的概念地址和指针的概念 10.210.2变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 10.310.3数组与指针数组与指针 10.410.4字符串与指针字符串与指针 10.510.5指向函数的指针指向函数的指针 10.610.6返回指针值的函数返回指针值的函数 10.710.7指针数组和指向指针的指针指针数组和指向指针的指针 10.810.8有关指针的数据类型和指针运算的小结有关指针的数据类型和指针运算的小结C程序设计(第三版)程序设计(第三版)

2、江苏大学 计算机科学与通信工程学院 3 10.1 10.1地址和指针的概念地址和指针的概念内存区的每一个字节有一个编号,这就是“地址地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。.按变量地址存取变量值的方式称为“直接访问直接访问”方式 (,);(,);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 4C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 52.另一种存取变量值的方式称为“间接访问间接访问”的方式。即,将变量的地址存放在另一个变量中。在语言中,指针是一种特殊的变量,它是在语言中,指针是一种特殊

3、的变量,它是存放地址的。存放地址的。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 6一个变量的地址称为该变量的“指针指针”。例如,地址2000是变量的指针-计算机给变量i分配存储空间的中的第一个字节的字节编号。如果有一个变量(计算机也给这个变量分配了存储空间)专门用来存放另一变量的地址(即指针),则它称为“指针变量指针变量”。上述的i_pointer就是一个指针变量。指针和指针变量的定义:指针和指针变量的定义:C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 7 10.2 10.2 变量的指针和指向变量的指变量的指针和指向变量的指 针变量针变

4、量10.10.1.1 定义一个指针变量定义一个指针变量定义指针变量的一般形式为基类型基类型 *指针变量名;指针变量名;这里的这里的*不是运算不是运算C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 8下面都是合法的定义:float *pointer_;char*pointer_;可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。例如:例如:pointer_;pointer_;C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 9(1)指针变量前面的“*”,表示该变量的类型为指针型变量。例:float *pointer_1;指

5、针变量名是pointer_1,而不是*pointer_1。(2)在定义指针变量时必须指定基类型。基类型不基类型不是指针变量的类型。是指针变量的类型。基类型:指针变量里面存放的是内存中的一基类型:指针变量里面存放的是内存中的一个字节编号,在这个编号所对应的存储空间里面存个字节编号,在这个编号所对应的存储空间里面存放的数据类型。放的数据类型。在在定义定义指针变量时要注意两点:指针变量时要注意两点:C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 10int*a 指针变量a的基类型是intfloat*b 指针变量b的基类型是float下面的赋值是错误错误的 float a;i

6、nt *pointer_1;基类型为int pointer_1=&a;变量a的类型为float 需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 1110.2.2 10.2.2 指针变量的引用指针变量的引用 注意注意:指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。例例10.通过指针变量访问整型变量通过指针变量访问整型变量#include void main()int a,b;int*pointer_1,*pointer_2;a=100;b=10;poin

7、ter_1=&a;/*把变量的地址赋给 pointer_1*/C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 12pointer_2=&b;/*把变量的地址赋给 pointer_2*/printf(%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 13对对“”和和“*”运算符说明:运算符说明:如果已执行了语句 pointer_;(1)*pointer_的含义是什么?的含义是什么?“”和“*”两个运算符的优先级别相同,但按自右而左方向结合。因此,*p

8、ointer_与相同,即变量a的地址。如果有pointer_2*pointer_;它的作用是将(的地址)赋给pointer_2,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。注:指针变量的值为某个变量的地址,则是指针变量指向某个变注:指针变量的值为某个变量的地址,则是指针变量指向某个变量。后面图示上用了一个符号量。后面图示上用了一个符号 来表示。来表示。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 14C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 15(2)*的含义是什么?的含义是什么?先进行运算,得的地址,再进

9、行*运算。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。(3)(*pointer_)相当于。)相当于。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 16例例10.2 输入和两个整数,按先大后小的顺序输出输入和两个整数,按先大后小的顺序输出 和。和。#include void main()int*p1,*p2,*p,a,b;scanf(%d,%d,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(a=%d,b=%dn,a,b);printf(max=%d,min=%dn,*p1,*p2);C程序设计(

10、第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 17运行情况如下:运行情况如下:,当输入,时,由于,当输入,时,由于,将和交换。交换前的情况见图将和交换。交换前的情况见图(),交换后见图()。(),交换后见图()。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 1810.2.3 10.2.3 指针变量作为函数参数指针变量作为函数参数例例10.3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出#includevoid main()void swap(int*p1,int*p2);int a,b;int*pointer_1,*pointer_2

11、;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 19void swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 20C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 21 10.3 10.3 数组与指针数组与指针 一个变量

12、有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元数组元素的指针就是数组元素的地址素的地址。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 22定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。例如:例如:;(定义为包含个整型数据的数组)*;(定义为指向整型变量的指针变量)应当注意,如果数组里存放的数据为型,则指针变量的基类型亦应为型。10.3.1 10.3.1 指向数组元素的指针指向数组元素的

13、指针C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 23对该指针变量赋值:对该指针变量赋值:;把元素的地址赋给指针变量。也就是使指向数组的第位置上的元素,如图:C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 2410.3.210.3.2通过指针引用数组元素通过指针引用数组元素引用一个数组元素,可以用:()()下标法,如形式;下标法,如形式;以前学的内容以前学的内容()()指针法,如指针法,如*()或()或*()()。其中是数组名(数据在计算机中存储的地址),是指向数组元素的指针变量,其初值。例例10.5 输出输出数组中的全部元素。数组中的全部

14、元素。假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 25(1)下标法。下标法。#include void main()int a10;int i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,ai);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 26(2)通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。#include void main()int a10;int

15、 i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,*(a+i);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 27(3)用指针变量指向数组元素。用指针变量指向数组元素。#include void main()int a10;int*p,i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(p=a;p(a+10);p+)printf(%d,*p);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 28例例10.通过指针变量通过

16、指针变量输出输出数组的个元素。数组的个元素。#include void main()int *,;for(;)scanf(,);printf();for(;,)printf(,*);程序运行情况:程序运行情况:1 2 3 4 5 6 7 8 9 022153 234 0 0 30036 25202 11631 8259 8237 28483显然输出的数值并不是数组中各元素的值显然输出的数值并不是数组中各元素的值 通过调试程序找出程序的问题?通过调试程序找出程序的问题?C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 29*和和和和+运算符运算符运算符运算符仔细理解,*和

17、+是同级运算符,结合方向为自右而左*p+等同于*(p+),先执行*p,然后p=p+1*+p 等同与*(+p),先执行p=p+1,然后执行*p(*p)+,先执行*p,然后使得*p的值加1+(*p),先使得*p的值加1,然后执行*p通过程序10-6-1.c加深理解C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 3010.3.3 10.3.3 用数组名作函数参数用数组名作函数参数在第在第8章章8.7节中介绍过可以用数组名作函数的参数节中介绍过可以用数组名作函数的参数如:void main()(int arr,int);int array;(array,);void(int

18、arr,int)C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 31例例10.将数组中个整数按相反顺序存放。将数组中个整数按相反顺序存放。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 32#include void main()void inv(int x,int n);int i,a10=3,7,9,11,0,6,7,5,4,2;printf(The original array:n);for(i=0;i0;i+)printf(%d,ai);printf(n);inv(a,10);printf(The array has been in

19、verted:n);for(i=0;i10;i+)printf(%d,ai);printf(n);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 33void inv(int ,int)/*形参x是数组名*/int temp,();for(;);temp;temp;return;运行情况如下:运行情况如下:The original array:,The array has been inverted:,C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 34#include void main()void inv(int*,int);int,;p

20、rintf(The original array:);for(;)printf(,);printf();inv(,);printf(The array has been in verted:);for(;)printf(,);printf();对刚才的程序可以作一些改动。将对刚才的程序可以作一些改动。将函数函数inv中的形参改成指针变量。中的形参改成指针变量。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 35void inv(int*,int)/*形参x为指针变量*/int*,temp,*,*,();for(;,)temp*;*;*temp;return;C程序设计

21、(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 36如果有一个实参数组,想在函数中改变此数如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有组中的元素的值,实参与形参的对应关系有以下种情况:以下种情况:(1)形参和实参都用数组名,如:形参和实参都用数组名,如:void main()void (int ,int)int;(,);形参和实参都用数组名在例形参和实参都用数组名在例10.7程序已实现 C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 37(2)实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:void

22、main()void(int*,int)int ;(,);实参用数组名,形参用指针变量在实参用数组名,形参用指针变量在10-7-2.c程序中实现(3)实参形参都用指针变量。例如:实参形参都用指针变量。例如:void main()void(int*,int)int,*p=a;(p,);10.7程序改写为例10.8实现实参形参都用指针变量实参形参都用指针变量C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 38(4)实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:void main()void(int x,int)int,*p=a;(p,);将例10.7

23、程序中的函数inv替代10.8中的inv函数,编写程序10-7-4.c,实现实参为指针变量,形实参为指针变量,形参为数组名参为数组名C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 39例例109 用选择法对个整数按由大到小顺序排序。用选择法对个整数按由大到小顺序排序。函数sort的功能为用选择法对个整数按由用选择法对个整数按由大到小顺序排序大到小顺序排序 本程序实现实参为指向一维数组的指针变量,本程序实现实参为指向一维数组的指针变量,形参为一维数组名形参为一维数组名 在理解程序的基础上,改写程序实现在理解程序的基础上,改写程序实现实参形参都用指针变量实参形参都用指针变

24、量实参用数组名,形参用指针变量实参用数组名,形参用指针变量 C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 4010.3.4 10.3.4 多维数组与指针多维数组与指针 用指针变量可以指向一维数组中的元素,前面的知识可知地址+整数仍然为一个地址值*(地址+整数)等价地址整数1.1.多维数组元素的地址多维数组元素的地址例:定义二维数组定义二维数组int a34则二维数组名a的值是第一个元素存储空间的字节编号(第一个元素的地址)指针变量也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。C程序设计(第三版)程序设计(第三版)江苏大学

25、计算机科学与通信工程学院 41定义二维数组为int a34=1,2,3,4,5,6,7,8,9,10,11,12;调试程序在watch窗口理解a0,a1,a2,a+1的数值 二维数组是“数组的数组”,集合中的元素为一个集合。因此,可以理解二维数组由3个元素组成,每个元素是一个一维数组,即a0,a1,a2。地址值+1表示下一个数据的地址值概念可知,a+1就是下一个元素的地址,即a1这个元素的地址,得出a+1的值就是二维数组第二行数据在计算机中的存储地址。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 42*(地址(地址+整数)整数)地址地址整数整数a0 和*(a+0)等

26、价,都是相同的数据值因为a+0等于a,所以*(a+0)等于*a因此,a0,*(a+0),*a都是相同的数值 ,即0行首地址a0+2为地址值+整数,表示从a0这个地址值开始往后第二个元素的地址*(a0+2)等价a02,并且a0等价*(a+0)因此,*(a0+2)等价*(*(a+0)+2)等价定义二维数组为int a34=1,2,3,4,5,6,7,8,9,10,11,12;在watch窗口理解*a0,a0+2,*(*(a+0)+2)的数值参见书上表10-2,和例10.10加深对这部分知识的理解。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 432.2.指向多维数组元素

27、的指针变量指向多维数组元素的指针变量(1)指向数组元素的指针变量指向数组元素的指针变量例例10.11 10.11 用指针变量输出二维数组元素的值用指针变量输出二维数组元素的值#include void main()int 341,3,5,7,9,11,13,15,17,19,21,23;int*;for(;)()printf();printf(,*);运行结果如下:运行结果如下:1 3 5 7 9 11 13 1519 21 23 C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 44(2)指向由个元素组成的一维数组的指针变量指向由个元素组成的一维数组的指针变量例例10

28、.12 10.12 输出二维数组任一行任一列元素的值输出二维数组任一行任一列元素的值int(*p)4,表示p是一个指针变量,他指向包含4个整型元素的一维数组。p的使用就和二维数组名类似。给定p一个数值后,p+1就表示4个整型数据后接下来4个整数的起始地址。给定p一具体数据值后,包括该地址空间后的数据就形成了4个数据为一行的超长二位数组。运算级别高,(*p)如果不写(),则p先与4结合,int *p4与int(*p)4意义完全不同,表示一个一维数组,里面有4个元素,每个元素为地址值。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 45 10.10.字符串与指针字符串与指

29、针10.4.10.4.字符串的表示形式字符串的表示形式 例例 10.5 定义一个字符数组,对它初始化,定义一个字符数组,对它初始化,然后输出该字符串然后输出该字符串 实质:指针变量的基类型为实质:指针变量的基类型为char(1)用字符数组存放一个字符串,然后输出该字符串。用字符数组存放一个字符串,然后输出该字符串。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 46(2)用字符指针指向一个字符串。用字符指针指向一个字符串。可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。例例10.16 定义字符指针定义字符指针#include void main(

30、)char*string I love China!;printf(,);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 47string的值是字符串第一个字符的地址。的值是字符串第一个字符的地址。等价于等价于char*string;string I love China!改成以下程序是错误的改成以下程序是错误的#include void main()char*string;*string I love China!;printf(,);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 48例例10.10.7 7 将字符串复制为字符串。将字符串

31、复制为字符串。#include void()char am a boy,20;int;for(;*()!;)*()*();*();printf(string a is:,);printf(string b is:);for(;!;)printf(,);printf();C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 49也可以设指针变量,用它的值的改变来指向字符串中的不同的字符。例例10.8 用指针变量来处理例用指针变量来处理例10.17问题。问题。#include void main()char =I am a boy.,20,*p1,*p2;int;for(;*!

32、;p1,p2)C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 50*;*;printf(string is:,);printf(:);for(;!;)printf(,);printf();程序必须保证使和同步移动程序必须保证使和同步移动 C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 5110.4.2 10.4.2 字符指针作函数参数字符指针作函数参数例例10.19 用函数调用实现字符串的复制用函数调用实现字符串的复制#include void main()void copy_string(char from,char to);char a=

33、am a teacher;char =you are a student;printf(“string a=string,);printf(“copy string a to string b:n”);copy_string(,);printf(nstring a=%snstring b=%sn,a,b);(1)用字符数组作参数用字符数组作参数C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 52void copy_string(char from,char to)int;while(from!)tofrom;to;程序运行结果如下程序运行结果如下:string aI

34、am a teacher string b you are a student copy string a to string b:string a I am a teacherstringI am a teacherC程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 53(2)形参用字符指针变量形参用字符指针变量#include void main()void copy_string(char*from,char*);char*am a teacher.;char*you are a student;printf(string a=string,);printf(cop

35、y string a to string b:n);_(,);printf(nstring a=%snstring b=%sn,a,b);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 54void copy_string(char*,char*)for(;*from!;from,to)*tofrom;*to;(3)(3)对对copy_ string 函数还可作简化函数还可作简化参见书上内容参见书上内容 C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 55(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符

36、串第1个字符的地址),决不是将字符串放到字符指针变量中。(2)赋值方式。对字符数组只能对各个元素赋值,不 能用以下办法对字符数组赋值。char str;strI love China!;而对字符指针变量,可以采用下面方法赋值:char*;I love China!;10.4.3 10.4.3 对使用字符指针变量和字符数组的讨论对使用字符指针变量和字符数组的讨论字符数组和字符指针变量二者之间的区别:字符数组和字符指针变量二者之间的区别:C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 56(3)对字符指针变量赋初值:char*love China!;等价于 char*;I

37、 love Chian!;而对数组的初始化:char str love China!;不能等价于 char str;str I love China!;C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 57(4)定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址。例如例如:char str;scanf(,str););C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 58(5)指针变量的值是可以改变的,例如:例例10.0改变指针变量的值改变指针变量的值#i

38、nclude void()char*I love China!;/地址值 printf(,);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 59#includemain()char*a=I love China!;a=a+7;printf(%c,a0);可参考书上例10.21加深理解。若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。*(地址+整数)等价地址整数例如例如:C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 6010.10.指向函数的指针指向函数的指针10.5.1 10.5.1 用函数指

39、针变量调用函数用函数指针变量调用函数用指针变量可以指向一个函数。函数在编译时被分配给一个入口地址。这个函数的入口地址就称为函数的指针函数的指针。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 61例10.22#include voidmain()int max(int,int);int,;scanf(,);(,);printf(,);int max(int,int)int;if();else ;return();C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 62将 main 函数改写为#include voidmain()int (int,

40、int);int(*)();int,;scanf(,);(*)(,);printf(,);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 6310.5.2 10.5.2 用指向函数的指针作函数参数用指向函数的指针作函数参数 函数指针变量常用的用途之一是把指针作为参数传递到其他函数。指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。通过书例10.23自己学习。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 6410.10.返回指针值的函数返回指针值的函数一个函数可以带回一个整型值、字符值、实型值等,也可

41、以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。这种带回指针值的函数,一般定义形式为类型名类型名*函数名(参数表列)函数名(参数表列);例如:int*(int,int);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 65例例10104 4 有若干个学生的成绩(每个学生有门课程有若干个学生的成绩(每个学生有门课程),要求在用户输入学生序号以后,能输出该学生的全),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。部成绩。用指针函数来实现。#include void main()float score 4=60,70,

42、80,90,56,89,67,88,34,78,90,66;float*search(float(*pointer)4,int n);float*;int,;printf(enter the number of student:);scanf(,);printf(The scores of No are:,);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 66 search(,);for(;)printf(,*();float*search(float(*)4,int)float*;*();return();运行情况如下:运行情况如下:enter the numbe

43、r of student:The scores of No.are:56.00 89.00 67.00 88.00C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 6710.7 10.7 指针数组和指向指针的指针指针数组和指向指针的指针10.7.1 10.7.1 指针数组的概念指针数组的概念一个数组,若其元素均为指针类型数据,称为指针指针数组数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为一维指针数组的定义形式为:类型名类型名*数组名数组长度;数组名数组长度;例如:例如:*;C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与

44、通信工程学院 68 二维数组存放字符串,每一行均为一个字符串,各字符串的长度一般不相等,如果按最长的字符串来定义列数,会浪费许多存储单元。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 69char*name=Follow me,BASIC,Great Wall,FORTRAN,Computer design;指针数组比较适合用来指向若干个字符串,节约了存储空间,如果想对字符串排序,不必改动字符串的位置,只需改动指针数组中各元素的指向(即改变各素元素的值,这些值是个字符串的首地址)。例例10.6 将若干字符串按字母顺序(由小到大)输出。将若干字符串按字母顺序(由小到大

45、)输出。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 7010.7.2 10.7.2 指向指针的指针指向指针的指针定义一个指向指针数据的指针变量定义一个指向指针数据的指针变量:*;的前面有两个*号。*运算符的结合性是从右到左,因此*相当于*(*),显然*是指针变量的定义形式。如果没有最前面的*,那就是定义了一个指向字符数据的指针变量。现在它前面又有一个*号,表示指针变量是指向一个字符指针变量的。*就是所指向的另一个指针变量。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 71例例10.7 使用指向指针的指针。使用指向指针的指针。#inclu

46、de void main()char*name=Follow me,BASIC,Great Wall,FORTRAN,Computer design;char*;int;for(;);printf(,*);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 72例例10.28 一个指针数组的元素指向整型数据的简单例子一个指针数组的元素指向整型数据的简单例子。#include void main()int,;int*num5=&a0,&a1,&a2,&a3,&a4;int *,;for(;)printf(,*);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通

47、信工程学院 7310.7.3 10.7.3 指针数组作指针数组作mainmain函数的形参函数的形参指针数组的一个重要应用是作为main函数的形参。在以往的程序中,main函数的第一行一般写成以下形式:void main()括弧中是空的。main函数可以有参数,例如:例如:void main(int argc,char *argv)。命令行的一般形式为命令名命令名 参数参数 参数参数参数参数C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 74例如一个文件,它包含以下的main函数:void main(int argc,char*argv)while()argv;pri

48、ntf(,*argv);argc;C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 7510.810.8有关指针的数据类型和有关指针的数据类型和指针运算的小结指针运算的小结10.8.110.8.1有关指针的数据类型的小结有关指针的数据类型的小结C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 76定定义义含含义义 ;定定义义整型整型变变量量*;为为指向整型数据的指指向整型数据的指针变针变量量intint a an n;定定义义整型数整型数组组,它有个元素,它有个元素 *;定定义义指指针针数数组组,它由个指向整型数据的指,它由个指向整型数据的指针针

49、元元素素组组成成 (*););为为指向含个元素的一指向含个元素的一维维数数组组的指的指针变针变量量 ();();为带为带回整型函数回整型函数值值的函数的函数 *();();为带为带回一个指回一个指针针的函数,的函数,该该指指针针指向整型数据指向整型数据 (*)();)();为为指向函数的指指向函数的指针针,该该函数返回一个整型函数返回一个整型值值*;是一个指是一个指针变针变量,它指向一个指向整型数据的指量,它指向一个指向整型数据的指针变针变量量C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 7710.8.2 10.8.2 指针运算小结指针运算小结(1)指针变量加(减)

50、一个整数指针变量加(减)一个整数例如:、等。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 78(2)指针变量赋值指针变量赋值将一个变量地址赋给一个指针变量。如:;(将变量的地址赋给)array;(将数组array首元素地址赋给)array;(将数组array第个元素 的地址赋给)max;(为已定义的函数,将的入口 地址赋给);(和都是指针变量,将的 值赋给)C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 79(3)指针变量可以有指针变量可以有空值空值,即该指针变量不指向任何,即该指针变量不指向任何变量变量。(4)两个指针变量可以相减两个指针

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁