【文档说明】《c语言程序设计基础》6指针课件.ppt,共(72)页,660.023 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44444.html
以下为本文档部分文字说明:
第6章指针2第6章指针本章内容6.2变量的指针和指针变量6.3指针运算6.4一维数组与指针6.1地址与指针6.5二维数组与指针3第6章指针本章内容6.7指针变量作函数的参数6.8函数与指针6.9指向指针的指针变量6.6字符数组与指针6.10指针应用举例46.1地址与指
针内存就是内部存储器,是由存储单元组成的。我们需要对它编号,这个编号就是内存地址。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配具体的物理内存单元。虽然程序中是通过变量名来对内存单元进行存取操作的,其实程序经过编译
以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。这种按变量地址存取变量值的方式称为“直接访问”方式。56.1地址与指针对应“直接访问”还有另外一种称之为“间接访问”的变量值存取方法,将变量的地址存放在另一个变量中,通过存放变量地址的变量存取变量的值。什么是指针呢?
C语言规定变量的地址就是变量的指针。对于变量a和存放变量地址的变量a_pointer来讲,一个用于存放变量的数值258,一个用于存放变量的地址2000,在这里的a_pointer就是指针变量。66.1地址与指
针内存地址:内存中存储单元的编号变量地址:系统分配给变量内存单元的起始地址变量地址起指向作用,因此形象称地址是变量的指针,即地址就是指针,指针就是地址变量地址,还隐含变量类型信息指针:一个变量的地址就是该变量的指针指针变量:专门存放
变量地址的变量76.1地址与指针整型变量i变量i_pointer…...…...1020002004200620052001200220032000指针变量指针变量i_pointer的内容(是地址)变量的地址整型变量i的内容指针86.1地址与指针变量的地址就是变量的指针。存放变量地址的
变量是指针变量,它用来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,在程序中用“*”符号表示指向,它实际执行的是“间接访问”运算,如果已定义a_pointer为指针变量且存放a变量的地址,则*a_pointer是a_
pointer所指向的变量。若a变量存放的值为3,则a代表3,a_pointer代表a的地址,*a_pointer代表a即3。96.2变量的指针和指针变量本节内容6.2.2指针变量的引用6.2.1指针变量的定义106.2.1指针变量的定义定义指针变量的一般形式为
基类型*指针变量名;下面都是合法的定义:float*pf;char*pc;可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向该变量。pointer_i=&i;pointer_j=&j;将变量i的地址存放到pointer_i中,
因此pointer_i就“指向”了变量i。116.2.1指针变量的定义在定义指针变量时要注意两点:①在定义指针变量时,指针变量名前面加“*”表示该变量的类型为指针型变量。指针变量名是pointer_i、pointer_j,而
不是*pointer_i、*pointer_j。但在使用指针变量时,指针变量名前面加“*”表示进行间接寻址操作。如有:i=3;j=*pointer_i;则j的值为3。一个指针变量只能指向同一个类型的变量,不能忽而指向一个整型变量,忽而指向一
个实型变量。126.2.2指针变量的引用指针变量同普通变量一样,在使用之前要先定义,但需注意的是指针变量定义后,变量值不确定,应用前还必须先赋予具体的值。未经赋值的指针变量是不能使用的。未经赋值的指针变量叫做“野指针”
,它的初始值是随机的。如果未经赋值而对它随机指向的内存单元进行操作,可能产生严重后果。指针变量只能赋予地址,绝不能赋予任何其他数据,否则将引起错误。136.2.2指针变量的引用6.2.2.1指针变量的初始化指针变量初
始化的一般形式为:基类型*指针名=初始地址值;在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。下面是两个有关指针变量的运算符。&:取地址运算符*:指针运算符(或
称间接访问运算符)inta;int*p=&a;//p指向a*p=10;//相当于a=10;146.2.2指针变量的引用#include<stdio.h>main(){charx,y;char*p1,*p
2;x='a';y='b';p1=&x;//把变量x的地址赋给p1p2=&y;//把变量y的地址赋给p2printf("%c,%c\n",x,y);printf("%c,%c\n",*p1,*p2);}156.2.2指
针变量的引用下面对“&”和“*”运算符再作些说明:①如果已执行了语句pl=&x;&*pl的含义是什么?先进行*p1的运算,它就是变量x,再执行&运算。因此,&*pl与&x相同,即变量x的地址。②*&x的含义是什么?先进行&x运算,得x的地址,再进行*运算,即&x所指向的变
量,也就是变量x。即*&x和*pl的作用是一样的,它们都等价于变量x,即*&x与x等价。如果p2=&*p1;它的作用是将&x(x的地址)赋给p2,如果p2原来指向y,经过重新赋值后它已不再指向y了,而指向了x。166.2.2指针变量的引用③(*p1)++相当于x++。如果没有括号,就成为了*
p1++,它相当于*(p1++)。由于++在p1的右侧,是“后加”,因此先对p1的原值进行*运算,得到x的值,然后使p1的值改变,这样p1不再指向x了。3变量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_poin
ter=3;i_pointer=&i=&(*i_pointer)i=*i_pointer=*(&i)176.2.2指针变量的引用#include<stdio.h>main(){int*p1,*p2,*p,x,y;scanf("%d,%d",&x,&y);p1=&x;p2=&y;if(x>y){p=
p1;p1=p2;p2=p;}printf("x=%dy=%d\n",x,y);printf("min=%dmax=%d\n",*p1,*p2);}186.2.2指针变量的引用6.2.2.2指针变量的赋值intx;int*p;若需要
通过指针变量p来操作x,那么可以先让p指向x,这只要将x的地址赋予pp=&x;变量x指针p*p2000196.2.2指针变量的引用在对指针变量赋值时,要注意以下问题:①在将一个普通变量的地址赋值给指针变
量时,要注意普通变量,必须先定义,再使用。②不能将一般的普通变量,例如整型变量赋给指针变量,指针变量也不能赋给普通变量;③可以将一个指针的值赋给另一个指针变量;④可以为一个指针赋值为NULL。int*p=NULL;避免对没有被初始化指针变量的非法引用void指针例void
*p不指定p是指向哪一种类型数据的指针变量206.3指针运算本节内容6.3.2指针的逻辑运算6.3.1指针的算数运算216.3.1指针的算数运算指针除了可以参与赋值和间接访问之外,只能进行加减运算和比较运算。在这些运算中,基类型起着
决定性的作用。6.3.1.1自加和自减运算指针变量可以进行自加和自减运算。floatx,*p;p=&x;假定变量x的内存起始地址为2000,现在进行如下运算:p++;但运算后p的值并不是2001,而是2004226.3.1指针的算数运算6.3.1.2与自加和自减相关的运
算floatx,y,*p;p=&x;假定x,y在内存中连续存储,且x的内存起始地址为2000,借此我们讨论几种常见的指针运算。⑴*p++和*(p++)由于++运算与*运算优先级别相同,但结合次序都是由右至左,故这二个表达式具有相同含义。又因为表达式p++的
值为p加1运算之前的值,因此,此表达式等同于变量x。不过,在计算完此表达是后,p加1,指向y。236.3.1指针的算数运算⑵*++p和*(++p)这是两个完全等同的表达式。因为表达式++p的值为p加1运算后的值,等于&y,指向y,
因此原表达式等同于变量y。⑶(*p)++由于变量*p与变量x等价,此表达式相当于x++。⑷++(*p)此表达式与++x等价,表达式计算后,p的值不变。246.3.1指针的算数运算6.3.1.3加减算术运算指针只可以与指针和整数进行部分加减
算术运算。⑴指针与整数的加减法指针可以与整数进行加减法运算,结果仍是指针。p=p+1;p++;两者作用相同,相当于指针移过一个由基类型所定义的位移量。⑵整数与指针的加减法一个整数与指针的加减法结
果仍是指针,但整数不能与指针进行减法运算,即类似5-p形式的表达式是错误的。⑶指针与指针的加减法两个指针不能进行加法运算,结果没有意义。两个指针的减法是允许的,但结果不再是指针而是一个整数,表示两个地址之间的距离。256.3.2指针的逻辑运算指针的逻辑运算相对简单,可以使用关系
运算符比较两个指针的大小,但通常是在两个指针指向同一目标,如一个数组或一内存块时才使用。特别的,可以将一个指针与0或NULL进行比较,以测试该指针是否已指向某一确定的内存地址。266.4一维数组与指针本节内容6.4.2指向数组的指针
变量的运算6.4.1通过指针引用一维数组元素276.4一维数组与指针120003520042008a[0]a[1]a[2]=2000a数组代表类型相同、连续存放连续数组名代表地址地址数组名代表常量常量286.4.1通过指针引用一维数组元素inta[10];*p;因为数组a为i
nt型,所以指向该数组的指针变量也应该为int型的指针变量。下面两种对指针变量赋值的方法是一样的:p=&a[0];或p=a;表示把a[0]元素的地址赋给指针变量p。或者说p指向a数组的第0号元素。p,a,&a[0]都指向同一单元,它们都是数组a的首
地址,也是数组a的0号元素a[0]的首地址。但需要注意的是:p是变量,而a和&a[0]都是常量,所以不能进行a++或++a之类的操作。296.4.1通过指针引用一维数组元素在C语言中,如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素。如果p的初值为a,则
p+i和a+i就是a[i]的地址,即它们是指向a数组的第i个元素;*(p+i)和*(a+i)就是p+i或a+i所指向的数组元素,即a[i];指向数组的指针变量也可以带下标,例如p[i]与*(p+i)等价。306.4.1通过指针引用
一维数组元素所以数组元素的引用可以有以下两种表示方法:①下标法,即用a[i]形式访问数组元素②指针法,即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,其初始值
p=a。316.4.1通过指针引用一维数组元素for(i=0;i<3;i++)1200035201a20042008printf("%d\n",a[i]);*(a+i)=2000数组恒等式:a[i]<=>*(a+i)326.4.1通过指针引用一维数组元素for
(i=0;i<3;i++)1200035201a20042008printf("%d\n"=2000pp=a;,a[i]);,p[i]);*(p+i)336.4.1通过指针引用一维数组元素指针是数组名数组名是指针指针是地址346.4.1通过指针引用一维数组元素1200035
201a20042008printf("%d\n",p[0]);=2000pp=a+1;printf("%d\n",*(p+0));printf("%d,%d\n",p[1],p[-1]);356.4.1通过指针引用一维数组元素a[0]a[1]a[2]a&a[0],a&a[2],
a+2地址a[0],*a,*(a+0)a[2],*(a+2)数值200020042008366.4.2指向数组的指针变量的运算6.4.2.1指向数组的指针变量的自加和自减inta[10],*p;p=a;进行如下运算:p++;则
指向数组的指针变量p指向了移过一个int类型所定义的位移量,即p指向变量a[1]的地址。我们可以得出这样一个结论:指向数组的指针变量进行的自加运算等同于使指针变量指向数组的下一个数组元素。同样适用于++p,p--和--p。376.4.2指向数
组的指针变量的运算6.4.2.2指向数组的指针变量的加减算术运算①指向数组的指针变量与整数进行加减运算时,相当于进行若干个自加或者自减预算,结果为指针变量指向相应的数组元素。②一个整数与指向数组的指针变量相加的结果和前边讨论的指向数组的指针变量与整数相加效果一样,但是整
数不能与指针进行减法运算。③两个指向同一数组的指针变量可以进行相减,但结果是一个整数,为两个数组元素之间的距离(即两个地址之间的距离,注意这个结果是以指针的基类型为单位的)。38数组与指针输出数组a[9]中的全部元素#include<stdio.h>
voidmain(){inta[9]={1,2,3,4,5,6,7,8,9};int*p=a,i;for(i=0;i<9;i++)printf("%4d",*(a+i));printf("\n");for(i=0;i<9;i++)printf("%4d",*
p++);printf("\n");}396.5二维数组与指针本节内容6.5.2通过指针引用二维数组元素6.5.3指针数组6.5.1二维数组元素的地址406.5.1二维数组元素的地址我们定义二维数组“intb[3][4];”可以认为b[
0]、b[1]、b[2]、b[3]是它的各个元素,采用指针的表示,就是*b、*(b+1)、*(b+2)、*(b+3);只不过这些“元素”都是一维数组而已。指针b的基类型是一维数组类型,且指针的运算是以基类型为单位的,b+1将第二行的一维数组。b+k是指向第k+1个
一维数组类型的指针,故*(b+k)表示第k+1行的一维数组。b[k]和*(b+k)也是指针。416.5.2通过指针引用二维数组元素由此可见,指针b、b[0]和*b都是指针且都指向数组的首地址,但它们的基类型不同:①因为b的“元素”为一维数组,故b是指向一维数组的指针而不是指向整数的指针。
当然,一维数组名也是指针,故b本质上是一种指向指针的指针。②b[0]是利用数组b的下标引用得到的变量,*b是指针b间接引用得到的变量,b[0]和*b都是b的第一个元素,都表示第一行的一维数组名,此刻它的元素为int类型,故b[0]和*b是指向int类型的指针。426.5.2通过指针引用二维数组元
素intb[3][4],*p;p=b;语句“p=b”表示把二维数组中b[0][0]元素的地址赋给指针变量p。p指向数组b的第一行第0号元素,即第一个元素。对于二维数组中第i+1行第j+1列的元素即b[i][j]我们可以看作是b数组中“元素”b[i]的j号元
素,b[i]是一个一维数组,可以看作是一个指针,指向一维数组b[i][0]的首地址,则元素b[i][j]的地址为b[i]+j,其基类型为int类型;再看数组b,其“元素”b[i]的的地址为b+i,但其基类型为数组类型。436.5.2通过指针引用二维数组元素如果将二维数组名a看成一个行地址(第
0行的地址),则a+i代表二维数组a的第i行的地址,a[i]可看成一个列地址,即第i行第0列的地址。行地址a每次加1,表示指向下一行列地址a[i]每次加1,表示指向下一列446.5.2通过指针引用二维数组元素*(*(a+i)+j)a:第0行的地址a+i:第i行的地址*
(a+i):即a[i],第i行第0列的地址*(a+i)+j:即&a[i][j],第i行第j列的地址*(*(a+i)+j):即a[i][j],第i行第j列的元素456.5.2通过指针引用二维数组元素对二维数组inta[3][4],有a----二维数组的首地址,即第0行的首地址a
+i----第i行的首地址a[i]*(a+i)----第i行第0列的元素地址a[i]+j*(a+i)+j----第i行第j列的元素地址*(a[i]+j)*(*(a+i)+j)a[i][j]466.5.2通过指针引用二维数组
元素a+i=&a[i]=a[i]=*(a+i)=&a[i][0],值相等,含义不同a+i&a[i],表示第i行首地址,指向行a[i]*(a+i)&a[i][0],表示第i行第0列元素地址,指向列476.5.
2通过指针引用二维数组元素二维数组两次取值是数值,其余情况是地址。**a或a[][]“*”与数组名紧密相连,表示第0行。*a"*"等价于"[]",都表示取值。在一次取值之前加行(a+i),一次取值之后加列(*a+j)。
判断二维数组地址与值四项基本原则486.5.2通过指针引用二维数组元素&a[2][3],*(a+2)+3,a[2]+3地址&a[2][0],a+2,*(a+2),*(a+2)+0,a[2],a[2]+0地址&a[0][3],*a+3,*(a+0)+
3,a[0]+3地址&a[0][0],a,a+0,*a,*(a+0),*a+0,*(a+0)+0,a[0],a[0]+0地址496.5.2通过指针引用二维数组元素a[2][3],*(*(a+2)+3),*(a[2]+3)数值
a[2][0],**(a+2),*(*(a+2)+0),*a[2],*(a[2]+0)数值a[0][3],*(*a+3),*(*(a+0)+3),*(a[0]+3)数值a[0][0],**a,*(*a+0),
**(a+0),*(*(a+0)+0),*a[0],*(a[0]+0)数值506.5.2通过指针引用二维数组元素输出数组a[3][3]中的全部元素#include<stdio.h>voidmain(){inta[3][3]={1,2
,3,4,5,6,7,8,9};int*p;for(p=a[0];p<a[0]+9;p++)//当作一维数组{if((p-a[0])%3==0)printf("\n");printf("%4d",*p);}}516.5.3指针数组一个数组,若其元素均为指针
类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为类型名*数组名[数组长度];例如:int*p[4];由于[]比*优先级高,因此p先与[4]结合,形成p[4]形式,这显然是
数组形式,它有4个元素。然后再与p前面的“*”结合,“*”表示此数组是指针类型的,每个数组元素(相当于一个指针变量)都可指向一个整型变量。526.5.3指针数组为什么要用到指针数组呢?这是因为它比较适合于用来指向若干个字符串,使字符串处理更
加方便灵活。可以分别定义一些字符串,然后用指针数组中的元素分别指向各字符串。如果想对字符串排序,不必改动字符串的位置,只需改动指针数组中各元素的指向(即改变各元素的值,这些值是各字符串的首地址)。这样,各字符串的长度可以不同,而且移动指针变量的值(地址)要比移动字
符串所花的时间少得多。536.5.3指针数组指针数组数组元素为指针,用于处理二维数组或多个字符串数据类型*数组名[数组长度];char*a[4]={"Fortran","Lisp","Basic",NULL}Lisp\
0Fortran\0Basic\0a[0]a[1]a[2]a[3]054数组与指针例6.5:将5个英文人名按字母顺序排列后输出#include<stdio.h>#include<string.h>voidsort(char*name[],i
ntn){char*p;inti,j,k;for(i=0;i<n-1;i++)//比较法排序{k=i;for(j=i+1;j<n;j++)if(strcmp(name[k],name[j])>0)k=j;if(k!=i)//只进行一次交换{p=name[i];name[i]=name[k];nam
e[k]=p;}}}voidmain(){char*name[]={"TOM","JHON","KATE","JACSON","MACEAL"};intn=5,i;sort(name,n);for(i=0;i<n;i++)printf("%s\n",name[i]);}55
6.6字符数组与指针在C语言程序中,可以用两种方法访问一个字符串。⑴用字符数组存放一个字符串,然后输出该字符串。⑵用字符指针指向一个字符串。可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。#incl
ude<stdio.h>voidmain(){char*string="IloveChina!";puts(string);}566.6字符数组与指针#include<stdio.h>voidmain(){char
a[]="Iamaboy.",b[20];inti;for(i=0;a[i]!='\0';i++)//用循环实现复制*(b+i)=*(a+i);*(b+i)='\0';printf("stringais%s\n",a);//输出两个字符串printf("stringbi
s");for(i=0;b[i]!='\0';i++)printf("%c",b[i]);printf("\n");}576.7指针变量作函数的参数#include<stdio.h>voidmax_min(int*x,intn,int*max,int*min);main(){inti,a
[10]={52,14,21,56,37,28,45,75,66,38},max,min;for(printf("Theoriginalarray="),i=0;i<10;i++)printf("%3d",a[i]);max_min(a,10,&m
ax,&min);printf("\nmax=%dmin=%d\n",max,min);}voidmax_min(int*x,intn,int*max,int*min){inti;*max=*min=*x;for(i=1;i<n;i++,x++){if(
*max<*x)*max=*x;if(*min>*x)*min=*x;}}586.8函数与指针本节内容6.8.2函数指针作函数参数6.8.3返回指针值的函数6.8.1指向函数的指针596.8.1指向函数的指针可以定义一个指针变量让它指向该函数的入口地址,那么对函数的调用就可以通过
指针变量完成了。这个指针变量称为指向函数的指针变量,也称为函数指针。定义函数指针的一般形式:数据类型(*指针变量名)();如int(*p)();此处表示定义了指针变量p,指向一个函数的入口地址,int表示函数返回
值的类型是整型,指针变量p可以指向返回值类型相同的不同函数。606.8.1指向函数的指针#include<stdio.h>intMAX(intx,inty){intz;z=(x>y?x:y);returnz;}main(){inta,b,max;printf("pleasei
nputa,b:");scanf("%d,%d",&a,&b);max=MAX(a,b);printf("max=%d\n",max);}616.8.1指向函数的指针#include<stdio.h>in
tMAX(intx,inty){intz;z=(x>y?x:y);returnz;}main(){inta,b,max;int(*p)(int,int);printf("pleaseinputa,b:");scanf("%d,%d",&a,&b);p=MAX;max
=(*p)(a,b);printf("max=%d\n",max);}626.8.2函数指针作函数参数#include<stdio.h>voidmain(){inta,b,add(int,int),dif(int,int),pro(int,int),quo
(int,int);voidprocess(int,int,int(*fun)(int,int));scanf("%d,%d",&a,&b);process(a,b,add);process(a,b,dif);proce
ss(a,b,pro);process(a,b,quo);}voidprocess(intx,inty,int(*fun)(int,int)){intresult;result=(*fun)(x,y);printf("%d\n",result);}636.8.2函数指针作函数参数a
dd(intx,inty){printf("add=");return(x+y);}dif(intx,inty){printf("dif=");return(x>y?x-y:y-x);}pro(intx,inty){printf("pro=");return(x*y);}qu
o(intx,inty){printf("quo=");return(x>y?x/y:y/x);}646.8.3返回指针值的函数返回指针值的函数也被称为指针函数。其定义形式为:类型标识符*函数名(参数表);例如int*f(intx,inty);其中f是函数名,调用f后
返回一个指向整型数据的指针值(地址),x、y是函数f的形参。需注意的是:指针函数定义时指针运算符“*”和函数名f两侧没有括号“()”。65#include<stdio.h>#include<string.h>char*fun(c
har*s,char*t){char*p,*r,*a;a=NULL;while(*s)//遍历s串,查找子串t{p=s;r=t;while(*r)if(*r==*p){r++;p++;}elsebreak;if(*r=='\0
')//条件成立表明已经在主串s中找到子串ta=s;//a指向子串t最后一次出现在主串s中的位置s++;}returna;}66main(){chars[100],t[100],*p;printf("PleaseenterstringS:");scanf("%s",s);pri
ntf("PleaseentersubstringT:");scanf("%s",t);p=fun(s,t);if(p)printf("Theresultis:%s\n",p);elseprintf("Notfound!\n");}676.9指向指针的指针变量如果一个指针变量存放的又是另一个指针
变量的地址,则称这个指针变量为指向指针的指针变量。通过指向指针的指针变量来访问变量则构成了二级或多级间接寻址。指向指针的指针变量说明的一般形式为:类型说明符**指针变量名;例如:int**pp;表示pp是一个指针变量,它指向另一个指针变量,而这
个指针变量指向一个整型量。下面举一个例子来说明这种关系。686.9指向指针的指针变量#include<stdio.h>main(){intx,*p,**pp;x=5;p=&x;pp=&p;printf("x=%d\n",**pp
);}696.9指向指针的指针变量#include<stdio.h>#defineNULL0voidmain(){char**p;char*name[]={"hello","good","world","bye",""};p=name+1
;printf("%o:%s",*p,*p);p+=2;while(**p!=NULL)printf("%s\n",*p++);}706.10指针应用举例#defineN10#include<stdio.h>main
(){inta[N],*pp,*p,*q,t;for(p=a;p<a+N;p++)scanf("%d",p);for(p=a;p<a+N-1;p++){pp=p;for(q=p+1;q<a+N;q++)if(*pp
>*q)pp=q;if(pp!=p){t=*p;*p=*pp;*pp=t;}}for(p=a;p<a+N;p++)printf("%d",*p);printf("\n");}71#include<stdio.h>move(in
t(*p)[3])//p为指向含3个元素的一维数组的{inti,j,t;//指针变量,可以指向二维数组的一行(行指针)for(i=0;i<3;i++)for(j=0;j<i;j++){t=*(*(p+i)+j);*(*(p+i)+j)=*(*(p+j)+i);*(*(p+j)
+i)=t;}}main(){inta[3][3]={1,2,3,4,5,6,7,8,9},i,j;for(i=0;i<3;i++)for(puts(""),j=0;j<3;j++)printf("%6d",a[i][j]);move(a);printf("\n");for(i=0;
i<3;i++)for(puts(""),j=0;j<3;j++)printf("%6d",a[i][j]);}72#include<stdio.h>voidswap(char*ps1,char*ps2);main(){chars1[]=
"abc",s2[]="rst",s3[]="xyz";if(strcmp(s1,s2)<0)swap(s1,s2);if(strcmp(s1,s3)<0)swap(s1,s3);if(strcmp(s2,s3)<0)swap(s2,s3);printf("
%8s%8s%8s",s1,s2,s3);}voidswap(char*ps1,char*ps2){charps[100];strcpy(ps,ps1);strcpy(ps1,ps2);strcpy(ps2,ps);}