《《指针程序设计》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《指针程序设计》PPT课件.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C C语言程序设计语言程序设计第第7 7章章 指针程序设计指针程序设计 C语言程序设计(第语言程序设计(第3版)版)张张 磊磊 编著编著 21世纪高等学校规划教材世纪高等学校规划教材 清华大学出版社清华大学出版社第第7 7章章 指针程序设计指针程序设计u7.1 指针概述 u7.2 指针变量的定义和使用u7.3 指针与数组 u7.4 指针作为函数的参数u7.5 指针函数和指向函数的指针变量u7.6 指针应用举例7.1 指针概述指针概述u7.1.1 指针变量u7.1.2 变量的直接访问和间接访问7.1.1 7.1.1 指针变量指针变量指针变量指针变量l l指针指针每一个变量,计算机都指定一段内存用
2、以存储变量每一个变量,计算机都指定一段内存用以存储变量值。变量使用的这段内存的开始地址,称为变量的值。变量使用的这段内存的开始地址,称为变量的地址。在地址。在C C语言中,把变量的地址称为指针。简单的语言中,把变量的地址称为指针。简单的说,指针就是变量的地址。说,指针就是变量的地址。l l指针变量指针变量专门用来保存指针的一类变量,通过指针变量就可专门用来保存指针的一类变量,通过指针变量就可以实现对其他变量的访问。以实现对其他变量的访问。指针变量可以指向任何一种数据类型,如可以指针变量可以指向任何一种数据类型,如可以指向基本类型的变量,也可以指向数组等。指向基本类型的变量,也可以指向数组等。变
3、量的直接访问和间接访问变量的直接访问和间接访问变量的直接访问和间接访问变量的直接访问和间接访问l l变量直接访问变量直接访问变量直接访问变量直接访问是指通过变量名直接使用变量数据。是指通过变量名直接使用变量数据。例如:例如:int a=10,b=20,c;int a=10,b=20,c;c=a+b;c=a+b;printf(%dn,c);printf(%dn,c);l l变量间接访问是指通过指针变量去访问其他变量数据。变量间接访问是指通过指针变量去访问其他变量数据。7.2 指针变量的定义和使用指针变量的定义和使用u7.2.1 指针变量程序示例 u7.2.2 定义指针变量u7.2.3 使用指针变
4、量 7.2.1 7.2.1 指针变量程序示例指针变量程序示例指针变量程序示例指针变量程序示例例例例例7-17-1 使用指针变量输出数据程序。/*program e7-1.c*/#includevoid main()int a,b;int*p1,*p2;/*定义指针变量*/a=100;b=10;p1=&a;/*p1指向a*/p2=&b;/*p2指向b*/printf(%d%dn,a,b);printf(%d%dn,*p1,*p2);7.2.2 7.2.2 定义指针变量定义指针变量定义指针变量定义指针变量l一般格式 数据类型数据类型*指针变量名1,*指针变量名2,;例如:intint*p1,*p2
5、;floatfloat*q;指针变量允许和其他变量同时定义:charchar ch,*str;l注意注意“数据类型数据类型数据类型数据类型”是指针变量要指向的变量的数据类型是指针变量要指向的变量的数据类型是指针变量要指向的变量的数据类型是指针变量要指向的变量的数据类型。7.2.3 7.2.3 7.2.3 7.2.3 使用指针变量使用指针变量使用指针变量使用指针变量1指针变量的初始化l一般格式 数据类型*指针变量名1=地址1,*指针变量名2=地址2,;例如:int m;int*p=&m;2使用赋值语句赋值l一般格式一般格式 指针变量指针变量=变变量地址量地址;例如:例如:intint m=196
6、,*p,*q m=196,*p,*q;p=&mp=&m;q=pq=p;pm&m p196&mq q7.2.3 7.2.3 7.2.3 7.2.3 使用指针变量使用指针变量使用指针变量使用指针变量3 3使用指针变量输入数据使用指针变量输入数据使用指针变量输入数据使用指针变量输入数据当指针变量有了确切的指向目标后,即可使用该指针变量为指向的目标输入数据。int a,*p;p=&a;scanf(%d,p);scanf语句的功能与下列语句等价:语句的功能与下列语句等价:scanf(%d,&a);4 4访问指针所指向的变量访问指针所指向的变量访问指针所指向的变量访问指针所指向的变量对于指针变量p,访问其
7、指向的变量时,使用“*”运算符:*p例如,对上面的程序段,输出变量a的数据:printf(%d,*p);其中,*p表示p指向的目标a。使用指针变量使用指针变量使用指针变量使用指针变量例例例例7-27-2 输入a和b两个整数,然后按先大后小的顺序输出。#includevoid main()int*p1,*p2,*p,a,b;printf(Input:);scanf(%d,%d,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=pp=p1;p1=p2;p2=p;printf(Output:);printf(%d,%dn,*p1,*p2);7.3 指针与数组指针与数组u指
8、针与一维数组 u7.3.2 指针与二维数组 u7.3.3 指针与字符串 u7.3.4 指针数组 指针与一维数组指针与一维数组指针与一维数组指针与一维数组l主要内容如何把一个指针和一维数组关联起来,即怎样使指针指向一维数组如何使用指针访问一维数组的元素l要解决的问题用指针实现一维数组的数据处理 7.3.1 7.3.1 指针与一维数组指针与一维数组指针与一维数组指针与一维数组l定义指向一维数组的指针变量 int a5=10,20,30,40,50,*p;p=&a0;u 用指针用指针p p访问数组元素访问数组元素 当当p指向指向a0后后 p与与&a0等价,等价,*p与与a0等价;等价;p+1与与&a
9、1等价,等价,*(p+1)与与a1等价;等价;p+i与与&ai等价,等价,*(p+i)与与ai等价;等价;也可以直接使用数组名为指针变量赋值也可以直接使用数组名为指针变量赋值也可以直接使用数组名为指针变量赋值也可以直接使用数组名为指针变量赋值:p=a p=a;也可以使用带下标的指针变量表示数组元素:也可以使用带下标的指针变量表示数组元素:也可以使用带下标的指针变量表示数组元素:也可以使用带下标的指针变量表示数组元素:pi与与ai等价,也与等价,也与*(p+i)等价。等价。1020304050a0a1a2a3a4pP+1P+2P+3P+47.3.1 7.3.1 指针与一维数组指针与一维数组指针与
10、一维数组指针与一维数组例例例例7-37-37-37-3 用指针实现一维数组的输入输出。/*program e7-3-1.c*/#include#define N 10void main()int aN;int*p=a,i;for(i=0;iN;i+)scanf(%d,p+i);for(i=0;iN;i+)printf(%d,*(p+i)*(p+i););/*program e7-3-2.c*/#include#define N 10void main()int aN;int*p=a,i;for(i=0;iN;i+)scanf(%d,p+);p=a;for(i=0;iN;i+)printf(%d
11、,*p+*p+);7.3.1 7.3.1 指针与一维数组指针与一维数组指针与一维数组指针与一维数组例例例例7-47-4 用指针编写一维数组的排序程序。#include#define N 10void main()int aN,i,j,temp,*p;printf(Data:);for(p=a;pa+N;p+)scanf(%d,p);for(i=1;iN;i+)for(p=a;p*(p+1)temp=*p;*p=*(p+1);*(p+1)=temp;printf(nResult:);for(p=a;pa+N;p+)printf(%4d,*p);printf(n);指针与二维数组指针与二维数组指针
12、与二维数组指针与二维数组l主要内容主要内容如何把一个指针和二维数组关联起来,即怎样如何把一个指针和二维数组关联起来,即怎样使指针指向二维数组使指针指向二维数组如何使用指针访问二维数组的元素如何使用指针访问二维数组的元素l要解决的问题要解决的问题用指针实现二维数组的数据处理用指针实现二维数组的数据处理 7.3.2 7.3.2 指针与二维数组指针与二维数组指针与二维数组指针与二维数组102030408070605018273645l回顾二维数组的存储 10a0020a0130a0240a0380a1070a1160a1250a1318a2027a2136a2245a23int a34;p pp+1
13、p+1p+2p+2p+3p+3p+4p+4p+5p+5p+6p+6p+7p+7p+8p+8p+9p+9p+10p+10p+11p+11如何使如何使p p指向首元素?指向首元素?aijaij的指针如何表示?的指针如何表示?n n 问题问题问题问题7.3.2 7.3.2 指针与二维数组指针与二维数组指针与二维数组指针与二维数组l l指针和二维数组元素的对应关系指针和二维数组元素的对应关系设设p p是指针变量,若有:是指针变量,若有:p=a0;p=a0;则则p+jp+j将指向将指向a0a0数组中的元素数组中的元素a0ja0j。由于由于a0a0、a1a1、aM-1aM-1等各个行数组依次连续存储,则对
14、等各个行数组依次连续存储,则对于于a a数组中的任一元素数组中的任一元素aijaij,指针的一般形式如下:,指针的一般形式如下:p+i*N+jp+i*N+j元素元素aijaij相应的指针表示为:相应的指针表示为:*(p+i*N+j)*(p+i*N+j)aijaij也可用指针下标法表示:也可用指针下标法表示:pi*N+jpi*N+j7.3.2 7.3.2 指针与二维数组指针与二维数组指针与二维数组指针与二维数组l l举例举例int a34=10,20,30,40,50,60,70,80,90,91,92,93;int a34=10,20,30,40,50,60,70,80,90,91,92,93
15、;int*p=a0;int*p=a0;则数组则数组a a的元素的元素a12a12对应的指针为:对应的指针为:p+1*4+2p+1*4+2元素元素a12a12也就可以表示为:也就可以表示为:*(p+1*4+2)*(p+1*4+2)用下标表示法,用下标表示法,a12a12表示为:表示为:p1*4+2p1*4+27.3.2 7.3.2 指针与二维数组指针与二维数组指针与二维数组指针与二维数组例例例例7-57-5 求二维数组元素的最大值。求二维数组元素的最大值。/*program e7-5.c*/*program e7-5.c*/#include#includevoid main()void main
16、()int a34=3,17,8,11,66,7,8,19,12,88,7,16;int a34=3,17,8,11,66,7,8,19,12,88,7,16;int*p,max;int*p,max;for(for(p=a0p=a0,max=*p;pa0+12;p+),max=*p;pmax)if(*pmax)max=*p;max=*p;printf(Max=%dn,max);printf(Max=%dn,max);7.3.2 7.3.2 指针与二维数组指针与二维数组指针与二维数组指针与二维数组例例7-67-6 求二维数组元素的最大值,并确定最大值元素所在的行和列。求二维数组元素的最大值,并确
17、定最大值元素所在的行和列。/*program e7-6.c*/*program e7-6.c*/#include#includevoid main()void main()int a34=3,17,8,11,66,7,8,19,12,88,7,16;int a34=3,17,8,11,66,7,8,19,12,88,7,16;int int*p=a0,*p=a0,max,i,j,row,col;max,i,j,row,col;max=a00;max=a00;row=col=0;row=col=0;for(i=0;i3;i+)for(i=0;i3;i+)for(j=0;j4;j+)for(j=0
18、;jmax)if(*(p+i*4+j)max)max=*(p+i*4+j);max=*(p+i*4+j);row=i;row=i;col=j;col=j;printf(a%d%d=%dn,row,col,max);printf(a%d%d=%dn,row,col,max);7.3.3 7.3.3 指针与字符串指针与字符串指针与字符串指针与字符串l l使字符型指针指向字符串的方法使字符型指针指向字符串的方法 通过定义指针变量时初始化指向字符串。通过定义指针变量时初始化指向字符串。char*p=a string;char*p=a string;利用赋值语句使指针变量指向字符串。利用赋值语句使指针变
19、量指向字符串。char ch20char ch20,*s;*s;char*str1=ch,*str2;char*str1=ch,*str2;s=string;s=string;str2=str1;str2=str1;7.3.3 7.3.3 指针和字符串指针和字符串指针和字符串指针和字符串例例例例7-77-7 用指针复制字符串。用指针复制字符串。/*program e7-7.c*/*program e7-7.c*/#include#includevoid main()void main()char a=I am a student.;char a=I am a student.;char b30
20、,*p1,*p2;char b30,*p1,*p2;int i;int i;for(p1=a,p2=b;*p1!=0;p1+,p2+)for(p1=a,p2=b;*p1!=0;p1+,p2+)*p2=*p1;*p2=*p1;*p2=0;*p2=0;printf(String b:%sn,b);printf(String b:%sn,b);7.3.4 7.3.4 指针数组指针数组指针数组指针数组l数组元素为指针类型的数组称为指针数组,指针数组中的每一个元素都是指针变量。l一维指针数组的定义形式如下:数据类型数据类型数据类型数据类型*数组名数组名数组名数组名 数组长度数组长度数组长度数组长度;例:
21、例:例:例:char*days7;该语句定义了一个名为days的字符型指针数组,其每一个元素都是指向char变量的指针变量。l指针数组的每个元素是指针变量,只能存放地址,所以对指向字符串的指针数组赋初值时,要把存放字符串的首地址赋给指针数组的对应元素。例:例:例:例:char*days7=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;7.3.4 7.3.4 指针数组指针数组指针数组指针数组指针数组元素指针数组元素days0days0days1days1days2days2days3days3days4days4days5day
22、s5days6days6字符串字符串字符串字符串SundaySundayMondayMondayTuesdayTuesdayWednesdayWednesdayThursdayThursdayFridayFridaySaturdaySaturdaychar*days7char*days7=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;例例例例7-97-9 分行输出分行输出days数组指向的字符串。数组指向的字符串。#includevoid main()int i;char*days7*days7=Sunday,Monday,T
23、uesday,Wednesday,Thursday,Friday,Saturday;for(i=0;i7;i+)puts(daysidaysi);7.4 7.4 指针作为函数的参数指针作为函数的参数指针作为函数的参数指针作为函数的参数l l7.4.1 7.4.1 简单指针变量作函数参数简单指针变量作函数参数l l7.4.2 7.4.2 指向数组的指针作函数的参数指向数组的指针作函数的参数l l7.4.3 7.4.3 字符串指针作函数的参数字符串指针作函数的参数7.4.1 7.4.1 简单指针变量作函数参数简单指针变量作函数参数简单指针变量作函数参数简单指针变量作函数参数指针变量指针变量指针变量
24、指针变量作形参作形参作形参作形参void swap(int*p1,int*p2)void swap(int*p1,int*p2)int temp;int temp;temp=*p1;temp=*p1;*p1=*p2;*p1=*p2;*p2=temp;*p2=temp;#include#includevoid main()void main()void swap(int*,int*);void swap(int*,int*);int x,y;int x,y;scanf(%d,%d,&x,&y);scanf(%d,%d,&x,&y);if(xy)if(xy)swap(&x,&y);swap(&x,
25、&y);printf(%d,%dn,x,y);printf(%d,%dn,x,y);例例例例7-107-107-107-10用用用用swap()swap()swap()swap()函数交函数交函数交函数交换两个变量的值换两个变量的值换两个变量的值换两个变量的值简单变量简单变量简单变量简单变量指针指针指针指针l简单指针变量作函数参数,实现简单变量的地址在函数中的传递。简单指针变量作函数参数,实现简单变量的地址在函数中的传递。7.4.1 7.4.1 简单指针变量作函数参数简单指针变量作函数参数简单指针变量作函数参数简单指针变量作函数参数例例例例7-117-11 用比较交换用比较交换用比较交换用比较
26、交换法,将一维数组的法,将一维数组的法,将一维数组的法,将一维数组的最大值移到数组的最大值移到数组的最大值移到数组的最大值移到数组的最末元素位置,交最末元素位置,交最末元素位置,交最末元素位置,交换过程用上述换过程用上述换过程用上述换过程用上述swapswap()()函数实现。函数实现。函数实现。函数实现。#include#includevoid main()void main()void swap(int*,int*);void swap(int*,int*);int i,a10=33,-12,97,3,7,18,9,51,10,9;int i,a10=33,-12,97,3,7,18,9,
27、51,10,9;for(i=0;i9;i+)for(i=0;iai+1)if(aiai+1)swap(&ai,&ai+1);swap(&ai,&ai+1);for(i=0;i10;i+)for(i=0;i10;i+)printf(%5d,ai);printf(%5d,ai);printf(n);printf(n);void void swap(int*p1,int*p2swap(int*p1,int*p2)int temp;int temp;temp=*p1;temp=*p1;*p1=*p2;*p1=*p2;*p2=temp;*p2=temp;7.4.2 7.4.2 指向数组的指针作函数的参数
28、指向数组的指针作函数的参数指向数组的指针作函数的参数指向数组的指针作函数的参数 例例例例7-127-12 求一维数组的最大元素值。求一维数组的最大元素值。l l用三个函数实现用三个函数实现 用输入函数用输入函数input()input()建立数组;建立数组;用用max_a()max_a()函数求最大值;函数求最大值;用用main()main()函数作为主控函数。函数作为主控函数。为了方便函数编写,先假定数组长度为为了方便函数编写,先假定数组长度为n n,指针,指针p p指向该数组。那么,指向该数组。那么,inputinput()()函数的功能是为函数的功能是为p p指向的数组输入指向的数组输入
29、n n个数据;个数据;max_a()max_a()函数的功能是在函数的功能是在具有具有n n个元素、由个元素、由p p指向的数组中找出最大值。指向的数组中找出最大值。7.4.2 7.4.2 7.4.2 7.4.2 指向数组的指针作函数的参数指向数组的指针作函数的参数指向数组的指针作函数的参数指向数组的指针作函数的参数 void input(int*p,int n)int i;for(i=0;in;i+)scanf(%d,p+i);return;int max_a(int*p,int n)int i,max=*p;for(i=1;imax)max=*(p+i);return(max);/*pro
30、gram e7-12.c*/#include#define N 10void main()void input(int*,int);int max_a(int*,int);int aN;input(a,N);printf(MAX=%dn,max_a(a,N);例例例例7-127-127-127-12 求一维数组的最大元素值。求一维数组的最大元素值。求一维数组的最大元素值。求一维数组的最大元素值。字符串指针作函数的参数字符串指针作函数的参数字符串指针作函数的参数字符串指针作函数的参数字符串指针作函数的参数,与前面介绍的数组指针作函字符串指针作函数的参数,与前面介绍的数组指针作函字符串指针作函数的
31、参数,与前面介绍的数组指针作函字符串指针作函数的参数,与前面介绍的数组指针作函数参数没有本质的区别,函数间传递的都是地址值,所不数参数没有本质的区别,函数间传递的都是地址值,所不数参数没有本质的区别,函数间传递的都是地址值,所不数参数没有本质的区别,函数间传递的都是地址值,所不同的仅是指针指向对象的类型不同而已。同的仅是指针指向对象的类型不同而已。同的仅是指针指向对象的类型不同而已。同的仅是指针指向对象的类型不同而已。例例例例7-137-137-137-13 用字符串指针作函数参数,将输入的一个字符串用字符串指针作函数参数,将输入的一个字符串用字符串指针作函数参数,将输入的一个字符串用字符串指
32、针作函数参数,将输入的一个字符串复制到另一个字符串中。复制到另一个字符串中。复制到另一个字符串中。复制到另一个字符串中。7.4.3 7.4.3 字符串指针作函数的参数字符串指针作函数的参数字符串指针作函数的参数字符串指针作函数的参数/*program e7-13.c*/#includevoid main()void copy_s(char*,char*);char a20,b30;printf(String A:);gets(a);copy_s(a,b);copy_s(a,b);printf(String B:);puts(b);void copy_s(char*str1,char*str2)
33、while(*str2=*str1)!=0)str1+;str2+;将将a字符字符串复制串复制到到b数组数组中中例例例例7-137-13 用字符串指针作函数参数,将输入的一个字符串复制到另一个用字符串指针作函数参数,将输入的一个字符串复制到另一个用字符串指针作函数参数,将输入的一个字符串复制到另一个用字符串指针作函数参数,将输入的一个字符串复制到另一个字符串中。字符串中。字符串中。字符串中。7.4.4 7.4.4 指针数组作函数的参数指针数组作函数的参数指针数组作函数的参数指针数组作函数的参数指针数组的元素是指针变量,用指针数组可以实现对一组字符串的处理。用指针数组作函数参数,就可以实现多字符
34、串处理的通用函数。例例7-14 将一组字符串按字典顺序排序后输出。l分析(1)使用指针数组days存储各个字符串的开始地址,使days的元素分别指向个字符串,通过指针数组days间接访问各个字符串。SundayMondayTuesdayWednesdayThursdayFridaySaturday days0days1days2days3days4days5days6(2)使用字符串比较函数strcmp(),比较两个字符串的大小。7.4.4 7.4.4 指针数组作函数的参数指针数组作函数的参数指针数组作函数的参数指针数组作函数的参数#include#includevoid main()void
35、 string_sort(char*,int);void string_out(char*,int);char*days7*days7=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;string_sort(daysdays,7);string_out(daysdays,7);void string_out(char*string,int n)int i;for(i=0;in;i+)printf(%s ,string i);void string_sort(char*string,int n)char*temp;int i,j;
36、for(i=1;in;i+)for(j=0;j)0)temp=string j;string j=string j+1;string j+1=temp;例例例例7-147-14 将一组字符串按字典顺序排序后输出。7.5 指针函数和指向函数的指针变量指针函数和指向函数的指针变量 u7.5.1 指针函数u*7.5.2 指向函数的指针变量7.5.1 7.5.1 指针函数指针函数指针函数指针函数函数返回值是指针类型的函数称为指针函数。函数返回值是指针类型的函数称为指针函数。n指针函数的定义的一般格式 数据类型 *函数名(形参表)函数体 例例例例7-167-167-167-16 将一组字符串中长度最大的
37、字符串找出来,并输出这个字符串。l分析设有n组字符串,由指针数组p_string指向,首先编写求最大长度字符串函数max_lenth(),该函数返回最长字符串的首地址,在主函数中调用它,并输出所求字符串。/*program e7-16.c*/*program e7-16.c*/#include#include#include#includevoid main()void main()char*max_lenth(char*,int);char*max_lenth(char*,int);char char*p_string4*p_string4=Sydney2000,Beijing2008,At
38、hens1996,Korea1992;=Sydney2000,Beijing2008,Athens1996,Korea1992;char*p;char*p;p=max_lenth(p_string,4);p=max_lenth(p_string,4);puts(p);puts(p);char*max_lenth(char*string,int n)char*max_lenth(char*string,int n)int i,posion,max_l;int i,posion,max_l;posion=0;posion=0;max_l=strlen(string0);max_l=strlen(s
39、tring0);for(i=1;in;i+)for(i=1;imax_l)if(strlen(stringi)max_l)max_l=strlen(stringi);posion=i;max_l=strlen(stringi);posion=i;return(stringposion);return(stringposion);7.6 7.6 指针应用举例指针应用举例指针应用举例指针应用举例例例7-187-18有红、黄、蓝、白、黑五种颜色的球若干个,每次取出三个球,打印出三种不同颜色球的可能取法。l问题分析与算法设计 定义表示颜色的指针数组p,使其元素p0、p1、p2、p3、p4分别指向字符串
40、“red”、“yellow”、“blue”、“white”、“black”,这5个字符串用于表示5种彩球颜色。指针数组p的定义方式如下:char*p5=red,yellow,blue,white,black;使用0、1、2、3、4分别代表红、黄、蓝、白、黑五种颜色,使用穷举法生成各种组合方案,具体由一个三重循环实现。设每次取出的球分别为i、j、k,它们分别是0、1、2、3和4等5种取值。外循环取第1个球,第二重循环取第2个球,第三重循取第3个球。由于3的个球颜色不能相同,所以只有ijk时才为所求,得到一种3色球组合方案。将每一种组合的i、j、k转化为相应的颜色字符串,具体颜色由指针pi、pj、
41、pk指向。#include#includevoid main()void main()int i,j,k,n=0;int i,j,k,n=0;char*p5=red,yellow,blue,white,black;char*p5=red,yellow,blue,white,black;for(i=0;i=4;i+)for(i=0;i=4;i+)for(j=0;j=4;j+)for(j=0;j=4;j+)for(k=0;k=4;k+)for(k=0;k=4;k+)if(i!=j)&(k!=i)&(k!=j)if(i!=j)&(k!=i)&(k!=j)n+;n+;printf(%-4d,n);pr
42、intf(%-4d,n);printf(%-8s%-8s%-8sn,pi,pj,pk printf(%-8s%-8s%-8sn,pi,pj,pk printf(Total:%dn,n);printf(Total:%dn,n);7.6 7.6 指针应用举例指针应用举例指针应用举例指针应用举例例例例例7-197-19 利用指针作参数的排序函数实现数组排序。利用指针作参数的排序函数实现数组排序。l l问题分析与算法设计问题分析与算法设计 定义对定义对n n个整数实现排序的函数个整数实现排序的函数p_sort()p_sort(),函数原型:,函数原型:void p_sort(int*p,int n)v
43、oid p_sort(int*p,int n)定义对定义对n n个整数实现输出的函数个整数实现输出的函数p_output()p_output(),函数原型:,函数原型:void p_output(int*p,int n)void p_output(int*p,int n)在主函数中定义有在主函数中定义有N N个元素的实参数组个元素的实参数组a a,然后调用,然后调用p_sort()p_sort()函数对函数对a a数组排序,并调用数组排序,并调用p_output()p_output()函数输出排序结果。函数输出排序结果。7.6 指针应用举例指针应用举例例例例例7-197-19 利用指针作参数的
44、排序函数实现数组排序。利用指针作参数的排序函数实现数组排序。l l实现程序实现程序/*program e7-19-1.c*/*program e7-19-1.c*/#include#include#define N 10#define N 10void void p_sort(intp_sort(int*,*,intint););void void p_output(intp_output(int*,*,intint););void main()void main()intint aNaN=3,-5,8,16,7,19,11,6,17,5;=3,-5,8,16,7,19,11,6,17,5;p
45、_sort(a,Np_sort(a,N););p_output(a,Np_output(a,N););void p_sort(int*p,int n)void p_sort(int*p,int n)int i,temp,*q;for(i=1;in;i+)for(q=p;q*(q+1)temp=*q;*q=*(q+1);*(q+1)=temp;void p_output(int*p,int n)void p_output(int*p,int n)int*q;for(q=p;qp+n;q+)printf(%d ,*q);printf(n);小小 结结(1)(1)(1)(1)指针是变量的地址,用于存
46、储指针的变量称为指针变量,通过指针变量可以实现对其他变量的间接访问。(2)(2)使用如下形式定义指针变量:数据类型*指针变量名;其中的“数据类型”是指针变量指向的目标的数据类型,指针变量只能使用变量的地址为其赋值。(3)(3)指针变量使数组的访问更加灵活。若p是指向一维数组a的指针变量,则数组元素ai可用指针表示为*(p+i)、pi,也可用数组名表示为*(a+i),ai的地址可以表示为&ai、p+i、a+i。(4)(4)使用字符型指针变量处理字符串是C语言中常用的一种方法,它首先通过一定的方式,使字符指针指向字符串,然后通过字符指针来访问字符串。小小 结结(2)(2)(5)(5)数组元素为指针
47、类型的数组称为指针数组,指针数组中的每一个元素都是指针变量,它们指向相同类型的数据。引入指针数组的主要目的,是为了提高对多个字符串操作时的方便性和灵活性,尤其适合于长度不等的字符串的处理。(6)(6)指针作为函数的参数时,在函数间传递的是变量的地址。简单指针变量作函数参数是指针作函数参数中最基本的内容,它的作用是实现一个简单变量的地址在函数中的传递。字符串指针作函数的参数与数组指针作函数参数没有本质的区别,函数间传递的都是地址值,所不同的仅是指针指向对象的类型不同而已。(7)(7)函数返回值是指针类型的函数称为指针函数,使用指针函数可以获得更多的处理结果。需要特别特别注意的是,对于指针函数,用return返回的值必须是一个指针值。