《语言课件之第10章指针.ppt》由会员分享,可在线阅读,更多相关《语言课件之第10章指针.ppt(109页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第十章第十章C程序设计(第三版)程序设计(第三版)http:/ 2l l 主要内容 10.1 10.1地址和指针的概念地址和指针的概念 10.10.变量的指针和指向变量的变量的指针和指向变量的 指针变量指针变量 10.10.数组与指针数组与指针 10.10.字符串与指针字符串与指针 10.10.指向函数的指针指向函数的指针 10.10.返回指针值的函数返回指针值的函数 10.10.指针数组和指向指针的指针指针数组和指向指针的指针 10.8 10.8有关指针的数据类型和指针运算的小结有关指针的数据类型和指针运算的小结C程序设计(第三版)程序设计(第三版)http:/ 3 10.1 10.1地址和
2、指针的概念地址和指针的概念内存区的每一个字节有一个编号,这就是“地址地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。.按变量地址存取变量值的方式称为“直接访问直接访问”方式 (,);(,);C程序设计(第三版)程序设计(第三版)http:/ 4C程序设计(第三版)程序设计(第三版)http:/ 52.另一种存取变量值的方式称为“间接访问间接访问”的方式。即,将变量的地址存放在另一个变量中。在语言中,指针是一种特殊的变量,它是在语言中,指针是一种特殊的变量,它是存放地址的。存放地址的。C程序设计(第三版)程序设计(第三版)http:/ 6一个变量的地址称为
3、该变量的“指针指针”。例如,地址2000是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量指针变量”。上述的i_pointer就是一个指针变量。指针和指针变量的定义:指针和指针变量的定义:C程序设计(第三版)程序设计(第三版)http:/ 7 10.2 10.2 变量的指针和指向变量的指变量的指针和指向变量的指 针变量针变量10.10.1.1 定义一个指针变量定义一个指针变量定义指针变量的一般形式为基类型基类型 *指针变量名;指针变量名;C程序设计(第三版)程序设计(第三版)http:/ 8下面都是合法的定义:float *pointer_;char*poin
4、ter_;可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。例如:例如:pointer_;pointer_;C程序设计(第三版)程序设计(第三版)http:/ 9在定义指针变量时要注意两点:在定义指针变量时要注意两点:(1)指针变量前面的“*”,表示该变量的类型为指针型变量。(2)例:float *pointer_1;(3)指针变量名是pointer_1,而不是*pointer_1。(4)(2)在定义指针变量时必须指定基类型。(5)需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面的赋值是错误的(6)float a;(7)int *pointer
5、_1;(8)pointer_1=&a;C程序设计(第三版)程序设计(第三版)http:/ 1010.2.2 10.2.2 指针变量的引用指针变量的引用 注意注意:指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。例例10.通过指针变量访问整型变量通过指针变量访问整型变量#include voidmain()int,;int*pointer_,*pointer_;pointer_;/*把变量的地址赋给 pointer_1*/C程序设计(第三版)程序设计(第三版)http:/ 11pointer_;/*把变量的地址赋给 pointer_*/printf(
6、%,%,);printf(%,%,*pointer_,*pointer_);C程序设计(第三版)程序设计(第三版)http:/ 12对对“”和和“*”“*”运算符说明:运算符说明:如果已执行了语句 pointer_;(1)*pointer_的含义是什么?的含义是什么?“”和“*”两个运算符的优先级别相同,但按自右而左方向结合。因此,*pointer_与相同,即变量a的地址。如果有pointer_2*pointer_;它的作用是将(的地址)赋给pointer_2,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。C程序设计(第三版)程序设计(第三版)http:/ 13C程序
7、设计(第三版)程序设计(第三版)http:/ 14(2)*的含义是什么?的含义是什么?先进行运算,得的地址,再进行*运算。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。(3)(*pointer_)相当于。)相当于。C程序设计(第三版)程序设计(第三版)http:/ 15例例10.2 输入和两个整数,按先大后小的顺序输出输入和两个整数,按先大后小的顺序输出 和。和。#include void main()int*1,*2,*,;scanf(,);1;if();printf(=,=,);printf(max=,min=,*1,*2);C程序设计(第三版)程序设计(第三版)ht
8、tp:/ 16运行情况如下:运行情况如下:,当输入,时,由于,当输入,时,由于,将和交换。交换前的情况见图将和交换。交换前的情况见图(),交换后见图()。(),交换后见图()。C程序设计(第三版)程序设计(第三版)http:/ 17C程序设计(第三版)程序设计(第三版)http:/ 1810.10.3.3 指针变量作为函数参数指针变量作为函数参数例例10.3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出#include void main()void swap(int*,int*);int,;int*pointer_,*pointer_;scanf(,);pointer_;po
9、inter_2;if(swap(pointer_,pointer_2);printf(,);C程序设计(第三版)程序设计(第三版)http:/ 19void swap(int*,int*)int temp;temp*1;*;*temp;C程序设计(第三版)程序设计(第三版)http:/ 20C程序设计(第三版)程序设计(第三版)http:/ 21例例10.输入、输入、3个整数,按大小顺序输出。个整数,按大小顺序输出。#include void main()void exchange(int*1,int*2,int*3);int ,*,*,*;scanf(%,%,%,&,&,&);exchang
10、e(,);printf(,);C程序设计(第三版)程序设计(第三版)http:/ 22void exchange(int*,int*,int*)void swap(int*,int*);if(*)swap(,);if(*)swap(,);if(*swap(,);void swap(int*,int*)int temp;temp*;*;*temp;C程序设计(第三版)程序设计(第三版)http:/ 23 10.3 10.3 数组与指针数组与指针 一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元
11、素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元数组元素的指针就是数组元素的地址素的地址。C程序设计(第三版)程序设计(第三版)http:/ 24定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。例如:例如:;(定义为包含个整型数据的数组)*;(定义为指向整型变量的指针变量)应当注意,如果数组为型,则指针变量的基类型亦应为型。10.3.1 10.3.1 指向数组元素的指针指向数组元素的指针C程序设计(第三版)程序设计(第三版)http:/ 25对该指针变量赋值:对该指针变量赋值:;把元素的地址赋给指针变量。也就是使指向数组的第号元素,如图:C程序设计(第三版)
12、程序设计(第三版)http:/ 2610.10.通过指针引用数组元素通过指针引用数组元素引用一个数组元素,可以用:()()下标法,如形式;下标法,如形式;()()指针法,如指针法,如*()或()或*()()。其中是数组名,是指向数组元素的指针变量,其初值。例例10.5 输出数组中的全部元素。输出数组中的全部元素。假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:C程序设计(第三版)程序设计(第三版)http:/ 27(1)下标法。下标法。#include void main()int;int;for(;)scanf(,);printf();for(;)printf(,);C程序设计(
13、第三版)程序设计(第三版)http:/ 28(2)通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。#include voidmain()int;int;for(;)scanf(,);printf();for(;)printf(,*();C程序设计(第三版)程序设计(第三版)http:/ 29(3)用指针变量指向数组元素。用指针变量指向数组元素。#include void main()int;int *,;for(;)scanf(,);printf();for(;();)printf(,*);C程序设计(第三版)程序设计(第三版)http:/ 30例例10.通
14、过指针变量输出数组的个元素。通过指针变量输出数组的个元素。#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程序设计(第三版)程序设计(第三版)http:/ 31#include void main()int*,;for(;)scanf(,);printg();p=a;for(
15、;,)printf(,*);C程序设计(第三版)程序设计(第三版)http:/ 3210.10.3 .3 用数组名作函数参数用数组名作函数参数在第在第8章章8.7节中介绍过可以用数组名作函数的参数节中介绍过可以用数组名作函数的参数如:void main()i(int arr,int);int array;(array,);void(int arr,int)C程序设计(第三版)程序设计(第三版)http:/ 33例例10 将数组中个整数按相反顺序存放。将数组中个整数按相反顺序存放。C程序设计(第三版)程序设计(第三版)http:/ 34#include void main()void inv(i
16、nt ,int);int,;printf(The original array:);for(;)printf(,);printf();inv(,);printf(The array has been in verted:);for(;)printf(,);printf();C程序设计(第三版)程序设计(第三版)http:/ 35void inv(int ,int)/*形参x是数组名*/int temp,();for(;);temp;temp;return;运行情况如下:运行情况如下:The original array:,The array has been inverted:,C程序设计(第
17、三版)程序设计(第三版)http:/ 36C程序设计(第三版)程序设计(第三版)http:/ 37#include void main()void inv(int*,int);int,;printf(The original array:);for(;)printf(,);printf();inv(,);printf(The array has been in verted:);for(;)printf(,);printf();对刚才的程序可以作一些改动。将对刚才的程序可以作一些改动。将函数函数inv中的形参改成指针变量。中的形参改成指针变量。C程序设计(第三版)程序设计(第三版)http:/
18、 38void inv(int*,int)/*形参x为指针变量*/int,temp,*,*,();for(;,)emp*;*;*temp;return;C程序设计(第三版)程序设计(第三版)http:/ 39如果有一个实参数组,想在函数中改变此数如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有组中的元素的值,实参与形参的对应关系有以下种情况:以下种情况:(1)形参和实参都用数组名,如:形参和实参都用数组名,如:void main()void (int ,int)int;(,);C程序设计(第三版)程序设计(第三版)http:/ 40C程序设计(第三版)程序设计(第三
19、版)http:/ 41(2)实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:void()void(int*,int)int ;(,);(3)实参形参都用指针变量。例如:实参形参都用指针变量。例如:void main()void(int*,int)int,*p=a;(p,);C程序设计(第三版)程序设计(第三版)http:/ 42C程序设计(第三版)程序设计(第三版)http:/ 43(4)实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:void main()void(int x,int),*p=a;(p,);C程序设计(第三版)程序设计(第三版)http
20、:/ 44#include void main()void inv(int*,int);int,*;printf(The original array:n);for(;,)scanf(,);printf();inv(,);/*实参为指针变量实参为指针变量*/printf(The array has been inverted:);for(;)printf(,*);printf();C程序设计(第三版)程序设计(第三版)http:/ 45void inv(int*,int)int,temp,*,*;();for(;,)emp*;*;*temp;return;C程序设计(第三版)程序设计(第三版)
21、http:/ 46例例109 用选择法对个整数按由大到小顺序排序。用选择法对个整数按由大到小顺序排序。#include void main()void sort(int ,int);int*,10;for(;)scanf(,);sort(,);for(,;)(,*);C程序设计(第三版)程序设计(第三版)http:/ 47void sort(int ,int)int,;for(;);for(;)();(!);C程序设计(第三版)程序设计(第三版)http:/ 4810.3.4 10.3.4 多维数组与指针多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上
22、和使用上,多维数组的指针比一维数组的指针要复杂一些。1.1.多维数组元素的地址多维数组元素的地址先回顾一下多维数组的性质,可以认为二维数组是“数组的数组”,例:定义定义int a34=1,3,5,7,;则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为 ,则C程序设计(第三版)程序设计(第三版)http:/ 49表表 示示 形形 式式含义含义地地 址址a 二维数组名,指向一维数组a0,即0行首地址2000a0,*(a+0),*a0行0列元素地址2000a+1,&a11行首地址2008a1,*(a+1)1行0列元素a10的地址2008A1+2,*(a+1)+2,&a121行2列元素
23、a12 的地址2012*(a1+2),*(*(a+1)+2),a121行2列元素a12的值元素值为13C程序设计(第三版)程序设计(第三版)http:/ 50例例10.0 输出二维数组有关的值输出二维数组有关的值#include define FROMAT,void main()int 341,3,5,7,9,;printf(,*);printf(,0,*();printf(,0,00);printf(,1,);printf(,10,*(+)+);printf(,*();printf(,);printf(,*(*();C程序设计(第三版)程序设计(第三版)http:/ 51某一次运行结果如下:
24、某一次运行结果如下:,(0行首地址和0行0列元素地址),(0行0列元素地址),(0行0首地址和0行0列元素地址),(1行0列元素地址和1行首地址),(1行0列元素地址),(2行0列元素地址),(2行首地址),(1行0列元素的值)C程序设计(第三版)程序设计(第三版)http:/ 522.2.指向多维数组元素的指针变量指向多维数组元素的指针变量(1)指向数组元素的指针变量指向数组元素的指针变量例例10.11 10.11 用指针变量输出二维数组元素的值用指针变量输出二维数组元素的值#include void main()int 341,3,5,7,9,11,13,15,17,19,21,23;in
25、t*;for(;)()printf();printf(,*);运行结果如下:运行结果如下:1 3 5 7 9 11 13 1519 21 23 C程序设计(第三版)程序设计(第三版)http:/ 53(2)指向由个元素组成的一维数组的指针变量指向由个元素组成的一维数组的指针变量例例10.13 10.13 出二维数组任一行任一列元素的值出二维数组任一行任一列元素的值#include void main()int 1,3,5,7,9,11,13,15,;int(*),;scanf(,);printf(,*(*();运行情况如下:,(本行为键盘输入),C程序设计(第三版)程序设计(第三版)http:
26、/ 543.用指向数组的指针作函数参数用指向数组的指针作函数参数例10.13 有一个班,个学生,各学门课,计算总平均分数以及第个学生的成绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。用函数average求总平均成绩,用函数search找出并输出第个学生的成绩。C程序设计(第三版)程序设计(第三版)http:/ 55#include void 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
27、;average(*score,12);*求12个分数的平均分*search(score,);*求序号为的学生的成绩*C程序设计(第三版)程序设计(第三版)http:/ 56void average(float*,int)float*_;float sum,aver;p_end;for(;_;)sumsum(*);aversum;printf(average,aver);C程序设计(第三版)程序设计(第三版)http:/ 57void search(float(*)4,int)/*p是指向具有4个元素的一维数组的指针*/int;printf(the score of No.%are:,);fo
28、r(;)printf(5.2,*(*();程序运行结果如下:程序运行结果如下:averageThe score of No.2 are:.C程序设计(第三版)程序设计(第三版)http:/ 58例例10.4 在上题基础上,查找有一门以上课程不及格的在上题基础上,查找有一门以上课程不及格的学生,打印出他们的全部课程的成绩。学生,打印出他们的全部课程的成绩。#include void main()void search(float(*p)4,int n);/*函数声明*/float score34=65,57,70,60,58,87,90,81,90,99,100,98;search(score,
29、);C程序设计(第三版)程序设计(第三版)http:/ 59void search(float(*p)4,int)int,;for(;)flag;for(;)if(*(*())flag;if()printf(No.%d fails,his scores are:n,j+1);for(;)printf(%.,*(*();printf();程序运行结果如下:No.1 fails,his scores are:.No.2 fails,his scores are:.C程序设计(第三版)程序设计(第三版)http:/ 60 10.10.字符串与指针字符串与指针10.4.10.4.字符串的表示形式字符串
30、的表示形式 例例 10.5 定义一个字符数组,对它初始化,定义一个字符数组,对它初始化,然后输出该字符串然后输出该字符串#include void main()char stringI love China!;printf(,string);(1)用字符数组存放一个字符串,然后输出该字符串。用字符数组存放一个字符串,然后输出该字符串。C程序设计(第三版)程序设计(第三版)http:/ 61(2)用字符指针指向一个字符串。用字符指针指向一个字符串。可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。例例106 定义字符指针定义字符指针#include void main()ch
31、arstring I love China!;printf(,);C程序设计(第三版)程序设计(第三版)http:/ 62例例10.10.7 7 将字符串复制为字符串。将字符串复制为字符串。#include void()char am a boy,20;int;for(;*()!;)*()*();*();printf(string a is:,);printf(string b is:);for(;!;)printf(,);printf();C程序设计(第三版)程序设计(第三版)http:/ 63也可以设指针变量,用它的值的改变来指向字符串中的不同的字符。例例10.8 用指针变量来处理例用指针
32、变量来处理例107问题。问题。#include void main()char =I am a boy.,20,*p1,*p2;int;for(;*!;p1,p2)C程序设计(第三版)程序设计(第三版)http:/ 64*;*;printf(string is:,);printf(:);for(;!;)printf(,);printf();程序必须保证使和同步移动程序必须保证使和同步移动 C程序设计(第三版)程序设计(第三版)http:/ 65C程序设计(第三版)程序设计(第三版)http:/ 66 字符指针作函数参数字符指针作函数参数例例10.19 用函数调用实现字符串的复制用函数调用实现字
33、符串的复制#include void main()void copy_string(char from,char to);char a=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程序设计(第三版)程序设计(第三版)http:/ 67void copy_string(char from,char
34、 to)int;while(from!)tofrom;to;程序运行结果如下程序运行结果如下:string aI am a teacher string b you are a student copy string a to string b:string a I am a teacherstringI am a teacherC程序设计(第三版)程序设计(第三版)http:/ 68(2)形参用字符指针变量形参用字符指针变量#include void main()void copy_string(char*from,char*);char*am a teacher.;char*you are
35、 a student;printf(string a=string,);printf(copy string a to string b:n);_(,);printf(nstring a=%snstring b=%sn,a,b);C程序设计(第三版)程序设计(第三版)http:/ 69void copy_string(char*,char*)for(;*from!;from,to)*tofrom;*to;(3)(3)对对copy string 函数还可作简化函数还可作简化 1、将、将copy_string函数改写为函数改写为void copy_string(char*from,char*)wh
36、ile(*from)!)to;from;C程序设计(第三版)程序设计(第三版)http:/ 70 copy_string函数的函数体还可改为函数的函数体还可改为 while(*to*from)!);copy_string函数的函数体还可写成函数的函数体还可写成 while(*from!)*to*from;*to;C程序设计(第三版)程序设计(第三版)http:/ 71上面的上面的while语句还可以进一步简化为下面的语句还可以进一步简化为下面的while语语句:句:while(*to*from);它与下面语句等价:while(*to*from)!);将*from赋给*to,如果赋值后的*to值
37、等于则循环终止(已赋给*to)函数体中函数体中while语句也可以改用语句也可以改用for语句:语句:for(;(*to*from)!;);或for(;*to*from;);C程序设计(第三版)程序设计(第三版)http:/ 72也可用指针变量,函数也可用指针变量,函数copy_string可写为可写为void copy_string(char from,char )char*,*;from;while(*p2*p1)!);C程序设计(第三版)程序设计(第三版)http:/ 73(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是
38、将字符串放到字符指针变量中。(2)赋值方式。对字符数组只能对各个元素赋值,不 能用以下办法对字符数组赋值。char str;strI love China!;而对字符指针变量,可以采用下面方法赋值:char*;I love China!;10.4.3 10.4.3 对使用字符指针变量和字符数组的讨论对使用字符指针变量和字符数组的讨论字符数组和字符指针变量二者之间的区别:字符数组和字符指针变量二者之间的区别:C程序设计(第三版)程序设计(第三版)http:/ 74(3)对字符指针变量赋初值:char*love China!;等价于 char*;I love Chian!;而对数组的初始化:cha
39、r str love China!;不能等价于 char str;str I love China!;C程序设计(第三版)程序设计(第三版)http:/ 75(4)定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址。例如例如:char str;scanf(,str););C程序设计(第三版)程序设计(第三版)http:/ 76(5)指针变量的值是可以改变的,例如:例例10.0改变指针变量的值改变指针变量的值#include void()char*I love China!;printf(,);C程序设计
40、(第三版)程序设计(第三版)http:/ 77#include voidmain()char*love hina!;int;printf(“The sixth character is%cn,a5);for(;!;)printf(,);若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。例如例如:C程序设计(第三版)程序设计(第三版)http:/ 7810.10.指向函数的指针指向函数的指针10.5.1 10.5.1 用函数指针变量调用函数用函数指针变量调用函数用指针变量可以指向一个函数。函数在编译时被分配给一个入口地址。这个函数的入口地址就称为函数的
41、指针函数的指针。C程序设计(第三版)程序设计(第三版)http:/ 79#include voidmain()int max(int,int);int,;scanf(,);(,);printf(,);int max(int,int)int;if();else ;return();C程序设计(第三版)程序设计(第三版)http:/ 80将 main 函数改写为#include voidmain()int (int,int);int(*)();int,;scanf(,);(*)(,);printf(,);C程序设计(第三版)程序设计(第三版)http:/ 8110.5.2 10.5.2 用指向函数
42、的指针作函数参数用指向函数的指针作函数参数 函数指针变量常用的用途之一是把指针作为参数传递到其他函数。指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。C程序设计(第三版)程序设计(第三版)http:/ 82 实参函数名 f1 void(int(*x1)(int),int(*x2)(int,int))int,;(*)();*调用函数*(*)(,);*调用函数*C程序设计(第三版)程序设计(第三版)http:/ 83例例10.10.3 3 设一个函数设一个函数processprocess,在调用它的时候,每次,在调用它的时候,每次实现不同的功能。输入和两
43、个数,第一次调用实现不同的功能。输入和两个数,第一次调用processprocess时找出和中大者,第二次找出其中小者,时找出和中大者,第二次找出其中小者,第三次求与之和。第三次求与之和。#include void main()int max(int,int);/*函数声明*/int min(int,int);/*函数声明*/int add(int,int);/*函数声明*/void process(int,int,int(*fun)();/*函数声明*/int,;printf(enter a and b:);scanf(,);C程序设计(第三版)程序设计(第三版)http:/ 84print
44、f(max);process(,);printf(min);process(,);printf(sum);process(,);C程序设计(第三版)程序设计(第三版)http:/ 85int max(int,int)/*函数定义*/int;if();else;return();int min(int,int)/*函数定义*/int;if();else;return();C程序设计(第三版)程序设计(第三版)http:/ 86int (int,int)/*函数定义*/int;return();void process(int,int,int(*fun)(int,int)int result;re
45、sult(*fun)(,);printf(,result);C程序设计(第三版)程序设计(第三版)http:/ 8710.10.返回指针值的函数返回指针值的函数一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。这种带回指针值的函数,一般定义形式为类型名类型名*函数名(参数表列)函数名(参数表列);例如:int*(int,int);C程序设计(第三版)程序设计(第三版)http:/ 88例例10104 4 有若干个学生的成绩(每个学生有门课程有若干个学生的成绩(每个学生有门课程),要求在用户输入学生序号以后,能输出该
46、学生的全),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。部成绩。用指针函数来实现。#include void main()float*score 4=60,70,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程序设计(第三版)程序设计(第三版)http:/ 89 search(,);for(;printf
47、(,*();float*search(float(*)4,int)float*;*();return();运行情况如下:运行情况如下:enter the number of student:The scores of No.are:56.00 89.00 67.00 88.00C程序设计(第三版)程序设计(第三版)http:/ 90例例10.5 对上例中的学生,找出其中有不及格课对上例中的学生,找出其中有不及格课程的学生及其学生号。程的学生及其学生号。#include void main()float score 4=60,70,80,90,56,89,67,88,34,78,90,66;fl
48、oat search(float(*pointer)4);float*;i,;C程序设计(第三版)程序设计(第三版)http:/ 91for(;)search(score);(*(score)printf(scores:,);for(;)printf(5.2,*();printf();C程序设计(第三版)程序设计(第三版)http:/ 9210.7 10.7 指针数组和指向指针的指针指针数组和指向指针的指针 指针数组的概念指针数组的概念一个数组,若其元素均为指针类型数据,称为指针指针数组数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为一维指针数组的定义形式为
49、:类型名类型名数组名数组长度;数组名数组长度;例如:例如:*;C程序设计(第三版)程序设计(第三版)http:/ 93C程序设计(第三版)程序设计(第三版)http:/ 94例例10.6 将若干字符串按字母顺序(由小到大)输出。将若干字符串按字母顺序(由小到大)输出。#include#include void main()void sort(char*name,int n);void printf(char*name,int n);char*name=Follow me,BASIC,Great Wall,FORTRAN,Computer design;int;sort(,);print(,);
50、C程序设计(第三版)程序设计(第三版)http:/ 95void sort(char*,int)char *;int,;for(;for(;if(strcmp(name,name)0)=;if(!)temp=namei;namei=namek;namek=temp;C程序设计(第三版)程序设计(第三版)http:/ 96void print(char*,int);(;)printf(,);运行结果为:运行结果为:Computer designFORTRANFollow meGreat WallC程序设计(第三版)程序设计(第三版)http:/ 9710.7.2 10.7.2 指向指针的指针指向