1、1,10 指针,2,C程序的变量所存放的数据:, 数值型数据:整数、实数,通过前面的学习,我们已知道:, 字符型数据:字符、字符串, 结构型数据:数组,3, 占有一定长度的内存 单元 如:int x; x占二字节、二个单元, 每一个变量都有一个地址,为无符号整数,它不同于一般的整数。, 能否对地址运算?, 能否用一个变量保存地址?,这些变量具有的性质:,?,问题:,4,10.1 指针变量的定义和初始化,一、数据在内存中的存放,设:系统分配i的起始地址为2000的单元,内存:为一个连续编号(连续地址)且以一个单元为一个字节的连续存贮区。若程序中定义了三个int变量i, j, kint i= 5,
2、 j=5, k=10;,则: j的起始地址有可能为为2002的单元,k的起始地址有可能为2004的单元,5,当程序中要用它们的值时:y=i+j+k;,找到j的地址2002, 将2002,20003中的数据5读出;,找到k的地址2004, 将2004,2005中的数据10读出。,分别 找到i的地址2000, 将2000,2001中的数据5读出;,则系统通过一张变量名与地址对应关系表:,6,直接访问:直接使用存放该数据的变量名。,间接访问:如果将某一变量的地址(如 i 的地址2000)存放到另一个变量x,则可通过x来存取i的值。,上述过程称为变量的“直接访问”,然后把这些数据进行算术运算。,i,相
3、当于使用 5,使用变量,7,如:用pi, pj, pk来存放i, j, k的地址,若要得到变量i的值,可以先访问pi,得到i的地址,再通过该地址找到它i的值。,8,显然,pi与i是通过i的地址联系起来的。,定义:一个变量的地址称为该变量的指针。因此,i的指针的值为2000。,如:pi就是指针变量。,而存放地址(指针)的变量叫做指针变量。,9,二、指针变量的定义形式:,表示该变量为指向某类型变量的指针变量。,如: int p; (p为指向整型变量的指针) char *s;(s为指向字符型变量的指针) float *t;(t为指向浮点型变量的指针),存储类型 类型名 变量名,10,指针变量的引用方
4、式:,如 int *p; char *s; float *t; *p=5; *s=a; *t=3.6;,变量名-表示指向变量的指针(地址)。,*变量名-表示所指变量的值。,11,三、指针变量的初始化,三种形式:, 类型名 *变量名=0;, 类型名 *变量名=NULL;, 类型名 *变量名=某个地址;,等价的,表示指针变量不指向任何值,12,10.2 指针变量的引用, 将一个变量的地址(指针)赋给一个指针变量,用取地址运算符:&,int i, j, p; i=3; p=,如果将整数赋给地址量p=1000;编译会提出警告性错误,但程序还是能正常运行,这是很危险的。,(只能这样赋值: p=1000;
5、),13, 存取指针变量所指向变量(目标变量)的值:用指针运算符*, 即:*p 为 i, &为同级运算符,结合性自右至左。 则当&或&在一起时,具有抵消作用,则:p=&i相当于p=i,如上例:,int i, p; i=3; p=,14,但当用地址(指针变量)作参数时,作用为传址,与数组名类似。,形参,于是,形,前面讲过:函数实参,参数据值的改变不会影响实参。,要求:形参、实参均为地址量。,10.3 指针变量作为函数参数,15,p2= p; main( ) int a, b;int x1, x2;scanf(“%d,%d“, ,程序运行结果:,输出: a=20, b=10,例: swap(p1,
6、 p2)int p1, p2; int p;p=p1;p1=p2,16,指针变量:,(实参),指针变量:,(形参),10,20,a,b,&a,p1,p2,x1,x2,&b,17,程序中,实参与形参共用同一个内存单元,通过修改地址所指的值来交换数据:,18,1. 注意函数中p为普通变量,并非地址量;,2. 如果swap函数中的交换语句改为:,swap(p1, p2) int p1, p2; int p; p=p1; p1=p2; p2=p; ,则仅将p1, p2的指向改变,函数返回后,p1, p2释放, a、b中的内容依然未改变。,19,调用函数时:,20,sway(p1, p2)int p1,
7、 p2; int p;p=p1;p1=p2;p2=p;,3. 不用地址量作参数,不能实现交换,即:,21,4. 结论:,若要使变量的值通过函数调用而发生改变,则形参必须是指针型,实参为地址量&或指针型。,另:全局变量和数组名作为参数也可改变变量的值.,22,10.4 指针表达式和指针的算术运算, 指针变量可进行赋值运算,和部分算术运算及关系运算。,如:+, , +, , +=, =,23,若有:float *t; 且:*t=3.6;设t的地址为2000,则t+12004,例:若有:int *p; 且:*p=5;设p的地址为2000,则p+12002,若有:char *s; 且:*s=a;设s的
8、地址为2000,则s+12001,一、指针移动,24,二、 关于指针的其它运算, p+ / p 的作用:,指针运算符 与+, 同级,且自右至左。,而 p 相当于p=p 1,即指向a4,若有:int a10 ,*p;,p=,则:p+相当于p=p+1, 即指向a6,25, (p)+ 或(p) (p)+:将p指向的变量的值自增1;(p) : 将p指向的变量的值自减1。,p+相当于(p+) (结合方向:自右向左)若p=&a0, 则*(p+)取出a0的值;,(+p):首先使pp+1, p指向a1,(+p)取出a1的值。, p+与(+p)的含义,26,例:,#include ,main( ), int a
9、5=11, 22, 33, 44, 55, *p;,p=,printf(“*p+=%dn“, *p+);,printf(“*p=%dn“, *p);,printf(“(*p)+=%dn“, (*p)+);,printf(“*p=%dn“, *p);,27,运行结果:,*p+=11,*p=22,(*p)+=22,*p=23,取出a0的值,指向a1的值,先取a1的值,使a1的值增加1,28,10.5 指针和数组的关系, 一个变量的地址为该变量的指针。当用一个变量来存放该地址(指针)时,称为指针变量。, 一个数组元素相当于一个简单变量。于是,亦可用一个指针变量来指向数组元素。,注意: 数组元素连续地
10、占用内存单元,则当一个元素的指针已知时,其它元素的指针亦可知道。,29,定义方法与简单变量指针定义相同,但引用略有不同,例: int a10;int p; /*定义*/p= /*将a的第1个元素的地址赋给p*/,一、数组元素指针变量的定义与引用,30, 指针也可用下标表示。,如:P2, 表示引用数组元素a2,C语言规定: 数组a的首地址即用&a0表示,亦可用a表示,所以:p= 和 p=a等价,31,例:,#include,main( ), int al=123, a2=234, a3=345;,int *pl, *p2, *p3;,int as3=1, 2, 3, *ps;,pl=,p2=p1
11、+1;,p3=p2+1;,printf(“p1=%ldn p2=%ldn p3=%ldn“, p1, p2, p3);,printf (“*p1=%ldn *p2=%ldn *p3=%ldn“, *p1, *p2, *p3);,ps=as;,printf (“ps0=%dn ps1=%dn ps2=%dn“, ps0, ps1, ps2);,32,运行结果:,p1=262737918,p2=262737920,p3=262737922,*p1=123,*p2=0,*p3=320,ps0=1,ps1=2,ps2=3,地址,a1的值,系统给定的值,数组元素地址,33,注意: 指针变量在未赋值前指向
12、一个不定值,例:#include ,main ( ), int *p;,printf( “*p=%d, p=%ld“, *p, p);,运行结果:*p=0, p=3842,34,int *p=,不能有这样的语句:p=&a0;,1. 由首地址指针来引用数组中的其它元素。设p为a的首地址,p=a,或p=,可以在定义指针变量时赋初值:,int a4=1, 2, 3, 4;,35,p+1为a1的地址,若a为int,p+1相当于地址+2, 而当a为float时,p+1相当于地址+4.,p+1 代表的是地址加一,如:int a3, *pa;,flaot b3, *pb;,pa=a; pb=b;,则指针与数
13、组元素的关系为:,36,一般地: p+i 代表 ai 的地址.,引用ai的值: 可使用ai, (p+i), (a+i), pi,例:,#include ,main( ), int a4=1, 2, 3, 4, *p, i;,p=a;,i=0;,do, printf(“*p=%d, p=%ldn“, *p, p);,p=p+1;,i=i+1;,while (i4);,37,运行结果:,*p=1, p=269750264,*p=2, p=269750266,*p=3, p=269750268,*p=4, p=269750270,38,例:int a10, i;int p;p=a;,则: (p+i)
14、和ai都是取数组元素的值,而p+i可直接指向ai。,2.在寻找数组元素时,用p+i比ai+速度快,39,例:输出已知一维数组中的5个整型数 (数组表示形式),#include,main( ),int a5=1,2,3,4,5,i;,for (i=0;i5;i+),printf(“%dt”,ai);,40,例:输出已知一维数组中的5个整型数 (指针中的地址相对表示形式),#include,main( ),int a5=1,2,3,4,5,i;,for (i=0;i5;i+),printf(“%dn”,*(a+i);,41,例:输出已知一维数组中的5个整型数 (指针中的地址绝对表示形式),#inc
15、lude,main( ),int a8=1,2,3,4,5,6,7,8,i;,int *p=a;,for ( i=0 ; i 8 ; i+),printf(“%dn”,*p+);,42,3、数组名作函数参数 数组名作函数参数 指针变量作函数参数 例10.7 将数组a中n个数反序排列 void inv(x,n) /*数组名作形参和实参*/int x,n;int t,i,j,m=(n-1)/2;for(i=0; im; i+)j=n-1-i;t=xi; xi=xj;xj=t;return;,43,main() int i, a10=0,1,2,3,4,5,6,7,8,9;printf(“the o
16、rginal array:n“);for(i=0;i10;i+)printf(“%d “,ai);printf(“n“);inv(a,10);printf(“the array has been inverted:n“);for(i=0;i10;i+)printf(“%d “,ai);printf(“n“); 运行结果:9 8 7 6 5 4 3 2 1 0,44,例10.8 从10个 数中找出其中最大的和最小的。 int max,min; /*全局变量*/void max_min_value(array,n)int array,n; int *p,*array_end;array_end=a
17、rray+n;max=min=*array;for(p=array+1;pmax) max=*p;else if(*pmin) min=*p;return;,int max,min; max_min_value(array,n)int *array,n; int *p,*array_end;array_end=array+n;max=min=*array; for(p=array+1;pmax) max=*p;else if(*pmin) min=*p;,形参和实参均用指针,45,main()int i,number10; int *p;printf(“Enter 10 datan“); p=
18、number; for(i=0;i10;i+)scanf(“%d“, 运行情况:Enter 10 data-2 4 6 8 0 -3 45 67 89 100 回车max=100, min=-3,46,例9.10 用选择法对10个整数排序。实参用指针而形参用数组 main() int *p,i,a10;p=a;for(i=0; i10; i+)scanf(“%d“,p+);p=a;sort(p,10);for(p=a,i=0;i10;i+)printf(“%d“,*p);p+;,sort(x,n)int x,n; int i, j, k, t;for(i=0;in-1;i+)k=i;for(j
19、=i+1;jn;j+)if(xjxk) k=j;if(k!=i)t=xi;xi=xk;xk=t;,47,1. 多维数组的地址: 将一维数组内容扩充,也可用一指针变量指向多维数组,以二维数组为例。,设: static int a34 = 1, 2, 3, 4, 5, 6,7, 8, 9, 10, 11, 12;,二、指向多维数组的指针和指针变量,48,可把数组a看成由3个元素组成:,49,设首地址a:2000, 则a+1:2008, a+2: 2016,于是:aij可表示为 *(*(a+i)+j), a0i的地址:a0+i, a+i, 和&a0i, aij的地址:ai+j= (a+i)+j,a1
20、i的地址:a1+i, (a+1)+i, &a1i,从一维数组中我们认为:a0与a, (a+0)等价,所以:a0i的地址&a0i还可表示为a0+i,50,#include,main(), int i, j, a3 4=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;,for (i=0; i3; i+),printf(“addr of a0 %d is: %ldn“, i, (a+i);,for (i=0; i3; i+),for (j=0; j4; j+),printf(“addr of a%d %d is: %ldn“, i, j, *(a+i)+j);,例:,51
21、,运行结果:,addr of a0 0 is: 261820392,addr of a0 1 is: 261820400,addr of a0 2 is: 261820408,addr of a0 0 is: 261820392,addr of a0 1 is: 261820394,addr of a0 2 is: 261820396,addr of a0 3 is: 261820398,addr of a1 0 is: 261820400,addr of a1 1 is: 261820402,addr of a1 2 is: 261820404,addr of a1 3 is: 261820
22、406,addr of a2 0 is: 261820408,addr of a2 1 is: 261820410,addr of a2 2 is: 261820412,addr of a2 3 is: 261820414,52,有了多维数组的地址概念后,可用指针变量来指向多维数组,设二维数组的大小为m*n, 则第i, j个元素相对于a00的个数为ni + j (i=0,1,,n1),2. 多维数组的指针, 指向数组元素,当用一个指针变量指向第1行的首地址后,即可搜索到全部元素。,设:int p;p=a0;则aij 的地址为p+i n+j,53,指针p,数组a,aij的地址:p+in+j,54
23、,例: 设有一34的二维数组,利用指针逐行逐个输出元素。,#include ,main(), int a3 4=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;,int p;,p=a;,printf(“a2 3=%dn“, (p+24+3);,printf(“number of a is:“);,for (;pa0+12; p+), if (pa0 )%4=0),printf(“n“);,printf(“%4d“, p);,55,运行结果:,a2 3=12,number of a is:,1 2 3 4,5 6 7 8,9 10 11 12,56,仍以上例为例: 当
24、p=a, 若要使p+1为下一行的首地址, 这时,需将p的定义改为:int (p)4;,第i行首地址,相当于ai, 指向数组的每一行,(p+i)+j),于是引用第(i, j)个元素的方法:, 之所以这样定义是为了使p+1的地址为a1。,注意:, 不能去掉( ),否则为int p4为指针数组;,57,例:,#include ,main( ), int a3 4=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,int (p) 4; /*指向一维数组的指针*/,p=a;,printf(“addr of a0 0 is:%lun“, (p+0);,printf(“addr o
25、f a1 0 is:%lun“, (p+1);,printf(“addr of a2 0 is:%lun“, (p+2);,printf(“a1 3 =%dn“, *(p+1)+3);,58,addr of a0 0 is: 4068,addr of a1 0 is: 4076,addr of a2 0 is: 4084,a1 3=8,运行结果:,59,例10.11 #define format “%d,%dn“ main() static int a34=1,3,5,7,9,11,13,15,17,19,21,23;printf(format,a,*a); 158,158printf(for
26、mat,a0,*(a+0); 158,158printf(format, 9,9 ,60,例10.12 用指针变量输出元素值。 main() static int a34=1,3,5,7,9,11,13,15,17,19,21,23;int *p;for(p=a0;pa0+12;p+)if(p-a0)%4=0) printf(“n“);printf(“%3d“,*p); 运行结果为:1 3 5 7 9 11 13 15 17 19 21 23a0为第0行第0列元素的地址,61,例10.13 输出二维数组任一行任一列的值。 main() /*用数组的指针变量进行操作*/ static int a
27、34=1,3,5,7,9,11,13,15,17,19,21,23;int (*p)4,i,j;p=a;printf(“input i ,j:”n); scanf(“%d,%d”, 运行情况:输入 1,2 回车输出 a12=13,62,例10.14 有一个班,3个学生,各4门课程,计算总平均分数和查找第n个学生的成绩。main() void average(); void search();static float score34=65,67,70,60,80,87,90,81,90,99,100,98;scanf(“%d”,63,void average(p,n)float *p;int n
28、; float *p_end;float sum=0,aver;p_end=p+n;for(;pp_end;p+)sum=sum+(*p);aver=sum/n;printf(“average=%5.2fn“,aver);,64,void search(p,n)float (*p)4;int n;int i;printf(“the score of No.%d are :n“,n);for (i=0;i4;i+)printf(“%5.1f“,*(*(p+n)+i);printf(“n“); 程序运行结果为:average=82.25the score of No.2 are :90.0 99.
29、0 100.0 98.0,65,例10.15 在上题的基础上,查找有一门以上课程不及格 的学生,打印出他们的全部课程的成绩。main() void search();static floatscore34=65,57,70,60,58,87,90,81,90,99,100,98;search(score,3);,66,void search(p,n)float (*p)4;int n;int i,j,flag;for (j=0;jn;j+) /*查找人*/flag=0; /*不及格标志*/for(i=0;i4;i+) /*查找某人的成绩*/if(*(*(p+j)+i)60) flag=1;if
30、(flag)printf(“No. %d is fail,his(her) scores are:n“,j+1);for (i=0;i4;i+)printf(“%5.1f “,*(*(p+j)+i);printf(“n“); ,67,程序运行结果为:No.1 fails, his(her) scores are:65.0 57.0 70.0 60.0 No.2 fails, his(her) scores are:58.0 87.0 90.0 81.0,68,一、字符串的表示形式1、用字符数组 如: char a 10=“CHINA”2、用字符指针 例10.17 main() char *st
31、ring=“I love China !”;printf(“%sn”,string); ,10. 6 字符串与指针,69,char *string=“I love China !”; 等价于下面两行: char *string; string =“I love China !”; 对字符串中字符的存取,可用下标法,也可以用指针法。例10.18 将字符串a复制到字符串b。main()char a=“I am a boy.“,b20; int i;for (i=0;*(a+i)!=0;i+) *(b+i)=*(a+i);*(b+i)=0;printf(“string a is: %sn“,a);p
32、rintf(“string b is: %sn“,b);for(i=0;bi!=0;i+) printf(“%c“,*(b+i);printf(“n“); ,70,例10.19 用指针变量来处理例10.18。 main()char a=“I am a boy.“,b20,*p1,*p2;int i;p1=a;p2=b;for (;*p1!=0;p1+,p2+)*p2=*p1;*p2=0;printf(“string a is: %sn“,a);printf(“string b is: %sn“,b);for(i=0;bi!=0;i+)printf(“%c“,*(b+i);printf(“n“)
33、; 注意:指针必须先赋地址才能使用。,71,二、字符串指针作函数参数参数是字符串或字符串指针,传递的是地址。在被调函数中改变后,可在主调函数中得到改变后的数据。 例 10.20 用函数调用实现字符串的复制。(1)用字符数组作参数 void copy_string(from,to)char from,to;int i=0;while(fromi!=0)toi=fromi;i+;toi=0;,72,main()char a=“I am a teacher.“,b=“you are a student.“;int i;printf(“string a is: %sn“,a);printf(“stri
34、ng b is: %sn“,b);copy_string(a,b);printf(“string a is: %sn“,a);printf(“string b is: %sn“,b);for(i=0;i18;i+)printf(“%c“,bi);,运行结果: I am a teacher.,73,(2)形参用字符指针变量 void copy_string(from,to)char *from,*to;int i=0;for(;*from!=0,from+,to+)*to=*from;*to=0;,74,main()char *a=“I am a teacher.“,*b=“you are a
35、student.“;int *p;printf(“string a is: %sn“,a);printf(“string b is: %sn“,b);copy_string(a,b);printf(“string a is: %sn“,a);for(p=b;*p!=0;p+)printf(“%c“,p); 运行结果:string a is : I am a teacher.I am a teacher. 这里的 p是指向字符数组元素的指针变量。,75,(3)函数体 的几种简化形式 1) void copy_string(from,to)char *from,*to;while(*to=*fro
36、m)!=0)to+;from+; 2) while(*to+=*from+)!=0); 3) while(*from!=0)*to+=*from+;*to=0; 4) while(*to+=*from+); 5) for(;(*to+=*from+)!=0;);或 for(;*to+=*from+;);,76,6) 用指针变量void copy_string(from,to)char from ,to ;char *p1,*p2;p1=from; p2=to;while(*p2+=*p1+)!=0);,77,三、字符指针变量与字符数组虽二者均能实现对字符串的存储和计算,但二者有区别,主 要有以
37、下几点:1、字符数组由元素组成,元素中放字符;字符指针变量放 地址(如字符串的首地址等);2、赋初值的方式不同;对字符数组赋初值一般用static, 如static char str =“I love China!”; 而字符指针变量赋初值一般不用static,如:char *p=“I love China!”;3、赋值方式不同;(1)对字符数组要么赋初值(即定义时赋值),要么对元 素赋值,下面的赋值方式是错误的:char str14; str14 =“I love China!”;,78,(2)字符指针变量赋值一般可赋初值,或先定义后赋值,如char *a; a= “I love China
38、!”; 等价于: char *a= “I love China!”;4、定义指针变量时,编译后便分配了存储单元,但为空; 如: char str10; scanf(“%s”,str); 为正确, 但 char *a; scanf(“%s”,a); 为错误的, 而 char *a, str10; a=str; scanf(“%s”,a); 为正确的。5、指针变量的值可改变; 例 10.21main() 运行结果为: char *a=“I love China“; China a=a+7;printf(“%s“,a); ,79,但对数组下面的是错误的: char str=“I love China
39、“; str=str+7;printf(“%s“,str);也可用下标形式引用指针变量 例 10.22 main() char *a=“I love China!“;int i;printf(“The sixth character is %cn“,a5);for(i=0;ai!=0;i+)printf(“%c“,ai);运行结果为: The sixth character is eI love China!,80,6、指针变量更方便。 (1)赋初值简单,不用static; (2)定义时可直接赋值; (3)可作地址用,也可使用下标。,81,基本概念:前面已述,每一个变量有地址,于是可用一个指针
40、变量来保存,而一个函数实际上为存放在内存中的一段程序,它有一个入口地址称为函数的指针。,存放函数指针的变量指向函数的指针变量。,10.7 指向函数的指针,82,一、用函数指针变量调用函数,1.函数指针变量的定义,例:int (p) ( );,表示p为一个函数指针变量,用于存放一个函数的入口地址,但该函数的返回值必须为int型。,83,2.给函数指针变量赋值,3.通过函数指针变量调用函数的方法,它不是实参,不是调用,而是将入口地址赋给该变量。,函数指针变量函数名;,(函数指针变量名) (实参表列),84,例: 求a、b中最大者函数。,int max(x, y)int x, y; int z;z=
41、(xy)? x:y;return(z); ,main ( ) int max( );int (p)( );int a, b, c;p=max;scanf(“a=%d, b=%d“, c=(p) (a, b)printf(“max value=%d“, c),/*将p指向函数max*/,/*调用函数*/,85,二、函数指针变量作为函数参数,意义:当一个函数被调用后,执行过程中可以根据实参的函数名来调用不同的函数。,前面介绍过:简单变量、数组名、指针变量均可作为函数的参数。,可以用函数指针变量作为函数的参数。,86,例:sub (x1, x2)int (x1 )( ), (x2 )( ); int
42、 a, b, i, j;a=(x1) (i);b=(x2) (i, j),于是,可用 sub(f1, f2)或sub(f3, f4)调用sub,表示执行sub时,根据实参传递过来的函数入口地址而调用f1, f2或f3, f4.,87,例2. 设计一个函数process, 每次实现不同的功能,当用不同的函数名作实参调用process时,process再去调用相应的函数。,程序如下:#include main ( )int max( ), min( ), add( );int a, b;printf(“enter a and b:“);scanf(“%d, %d“, ,88,printf(“max
43、=“);process(a, b, max);printf(“min=“)process(a, b, min);printf(“sum=“);process(a, b, add);,89,max(x, y)int x, y;int z;if (xy) z=x;else z=y; return(z);,min(x, y)int x, y;int z;if (xy) z=x;else z=y; return(z);,90,add(x, y)int x, y;int z;z=x+y;return(z);,process (x, y, fun)int x, y;int (* fun) ( );int
44、result;result=(*fun) (x,y);printf(“%dn“, result);,91,注:当用函数名作参数时,不论函数返值类型如何均应作说明,以与变量名相区别。,enter a and b:2, 6max=6min=2sum=8,运行情况如下:,92,一、指针数组,数组同种类型的数据集合。,当每一个元素均为指针类型数据时,该数组被称为指针数组。,10.8 指针数组,93,1. 定义形式,例:int p10;,p为指针型数组,其每一个元素为一指针型变量。用来存入一组地址。,类型说明符 数组名常量,94,灵活。,一般情况下,存放一组字符串,如一组书名,也可用二维字符数组存放,但
45、存在二个问题:,2.优越性,如:存放一组字符串,95,用指针数组(一维)保存各字符串首地址,且交换时只需交换指针数组各元素首地址即可解决上述二个问题。, 在对字符串排序时,若交换数组元素,时间太长。, 字符串长度不一,于是只得以最长字符串的长度作为二维数组列数,造成空间浪费。,96,例:将若干字符串按字母顺序(由小到大)输出。,#include #include main ( )void sort ( );void print ( );static char * name =“Follow me“, “BASIC“, “Great Wall“, “FORTRAN“, “Computer design“;int i; n=5;,97,sort (name, n); print(name, n); ,printf(“Before sort:n“);,for (i=0; i5; i+),printf(“mane%d=%sn“, i, namei);,void sort (name, n)char *name ; int n;char *temp;,98,int i, j, k;for (i=0; i0) k=j;,