资源描述
单击此处编辑母版标题样式,#,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第十章 指 针,C,语言中任何一个,实体,:变量、数组、函数等在内存中都要占据一个由若干字节组成的存储区域,每一个字节都有自己的地址,访问时首先找到实体的地址,再对地址的内容进行操作,如:,int a=3,b=4,;,float c=4.5,;,char c=,x,f=,y,;,3,4,4.5,x,y,&a=1010,1011,&b=1012,1013,&d=1014,1015,1016,1017,&c=1018,&f=1019,直 接 访 问:,实 体 间 接 访 问,&c=1018,&f=1019,&d=1014,&b=1012,&a=1010,3,4,4.5,x,y,&pf=2011,&pc=2010,&pd=2006,&pb=2004,&pa=2002,1019(pf),1018(pc),1014(pd),1012(pb),1010(pa),令:,pa=&a,pb=&b,pd=&d,pc=&c,pf=&f,实 体 间 接 访 问,令:,pa=pf=&f,*pa=a;*pb=b;*pd=d;*pc=c;*pf=f,Pa,、,pb,、,pc,、,pd,、,pf,就是指针(,地址,)变量即:存放,另一个变量的地址,的变量,*,pa,、*,pb,表示,pa,pb,所指向的变量,理 解:,pa,中存储 变量,a,的地址,通过这个地址找到,变量,a,的,值的存储位置,,然后从这个位置的存储空间中读出值,/,赋值,指 针 的 定 义,格 式:,指针类型 *,指针变量名(,=,初始化值,);,类 型:,即指针所指向的,对象的数据类型,指针类型必须与所指向的对象的数据类型一致,如:,int *,p;,p,是整型指针变量,,*,仅表示他后面的符号为指针变量,类型标示符:,int *,表示,p,是一个,存放,整型变量的,指针,(,地址,),变量,地址变量,P,只能存放另一个对象的地址,P,只有在确定了所指向的对象以后才能进行运算,允许,p=null,,但是随后使用时必须首先确定指向哪个对象,指 针 的 引 用,int *p,,,a=10;,p=,printf(,“,%d,”,p);/*,输出,p,的值(,&a)*/,printf(,“,%d,”,a);,printf(,“,%d,”,*p);,scanf(,“,%d,”,&a,);,scanf(,“,%d,”,p,);,向,p,所指向的变量的存储空间输入,整型数,*,p=100;,给,p,所指向的变量的存储空间存储整数,100,&a,100,a,*p=,p=a;,You are wrong!,初始化:,&p,p,&a,指 针 的 引 用,说明:,&a,:变量,a,的,存储空间(内存),的地址,*,P,:在定义时*表示其后的变量名为指针变量,在程序执行过程中,*是运算符,表示取,P,所指向的变量,的值或给,p,所指向的变量,赋值,int *p,,,a=10;,p=,*p=100;,printf(,“,%d,”,*p),*p,&(&a),&p,p,&a,&a,100,a,&b,指 针 的 引 用,main(),int *p1,*p2,a,b;,scanf(,“,%d%d,”,p1=,printf(,“,%d,%dn,”,*p1,*p2);,p2=p1;,printf(,“,%dt%d,”,*p1,*p2,),;,p1,p2,10,a,&a,&a,20,b,&b,&b,&a,指 针 的 引 用,main(),int *p1,*p2,*p;,Int a=10,b=20;,*p1=a;p2=,printf(,“,%d,%dn,”,*p1,*p2);,p=p1;p1=p2;p2=p;,printf(,“,%dt%d,”,*p1,*p2),;,p1,p2,10,a,&a,&a,20,b,&b,&b,交 换 指 针 值:,(,交换指针的对象指向),p,&a,&b,&a,P=p1;P1=p2=&(*p),指 针 的 引 用,main(),int *p1,*p2;,int a=10,b=20,t;,*p1=a;p2=,printf(,“,%d,%dn,”,*p1,*p2);,t=*p1;*p1=*p2;*p2=t,;,printf(,“,%dt%d,”,*p1,*p2),;,p1,p2,10,*p1=a,&a,&a,20,*p2=b,&b,&b,交换指针所指向的变量的值:,&t,10,20,10,指针作为函数参数,main(),swap(int*p1,int*p2);,int *pa,*pb,a,b;,scanf(,“,%d%d,”,&a,&b,);,pa=,if(ab)swap(,pa,pb,);,printf(,“,%d,%d,”,*pa,*pb,),;,printf(,“,n%d,%d,”,a,b),;,swap(int*p1,int*p2),int t;,t=*p1;,*p1=*p2;,*p2=t;,指针作为函数参数,swap(,int*,p1,int *,p2),int t;,t=*p1,;,*p1=*p2;*p2=t;,5,a,&b,pb,10,b,pa,&a,p1,p2,&a,&b,t,main(),.,*pa=a;*pb=b;,if(ab)swap(pa,pb);,printf(,“,%d,%d,”,*pa,*pb),;,printf(,“,n%d,%d,”,a,b),;,5,10,5,指针作为函数参数,main(),.,if(ab)swap(pa,pb);,printf(,“,%d,%d,”,*pa,*pb),;,printf(,“,n%d,%d,”,a,b),;,swap(int*p1,int *p2),int *t;,t=p1;,p1=p2;p2=t;,5,a,&b,pb,10,b,pa,&a,p1,p2,t,&a,&a,&b,&a,&b,指针作为函数参数,swap(int*p1,int *p2),int *t,;,*t=*p1;,*p1=*p2;*p2=*t;,main(),.,if(ab)swap(pa,pb);,printf(,“,%d,%d,”,*pa,*pb),;,printf(,“,n%d,%d,”,a,b),;,*t=null;,指 针 与 数 组,int a6,;,数组名,a,就是数组的起始地址,也为,a1,的,地址,可以用,a+1,表示;,ai,的,地址,可以用,a+i,表示,a+i=&ai,ai,实际地址:,1001+i*2,a(,1001,),a+1,a+2,a+3,a+4,a+5,for(i=0;i6;i+),scanf(,“,%d,”,a+i);,a0=15,a1=13,a2=8,a3=7,a4=9,a5=10,指 针 与 数 组,a(,1001,),a+1,a+2,a+3,a+4,a+5,15,13,8,7,9,10,数组访问:,访问,ai,时,先求出,ai,的存储单元的地址,a+i,,再找出此地址单元中的值,for(i=0;i6;i+),printf(,“,%d,”,ai,);,for(i=0;i6;i+),printf(,“,%d,”,*(a+i),);,指 针 与 数 组,int a6,,*,p;,p=a,;,(,或,p=&a0),a(,1001,),a+1,a+2,a+3,a+4,a+5,15,13,8,7,9,10,定义指针时直接赋值:,int a6;,int*p=a;,(int*p=,&a0,;),数组首地址赋值给指针变量,P,指针引用数组元素,int a6,,*,p=a;,p+1,为数组下标为,1,的数组元素的地址,p+i,为数组下标为,i,的数组元素的地址,即:,p+1=,p+1=a+1;,p+i,实际地址:,p+i*2,取值:,ai=*(p+i)=*(a+i),指向数组的指针变量可以带下标,pi=*(p+i)=ai=*(a+i),a0=15,a1=13,a2=8,a3=7,a4=9,a5=10,p=,p+1=,p+2=,p+3=,p+4=,p+5=,a(1001),a+1,a+2,a+3,a+4,a+5,指针引用数组元素,main(),int a6=15,13,8,7,9,10;,int i,*p=a,;,for(i=0;i6;i+),printf(,“,%dt,”,ai,);,for(i=0;i6;i+),printf(,“,n%dt,”,*(a+i),);,for(;pa+6;,p+,),printf(,“,n%dt,”,*p),;,for(p=a,i=0;i6;i+),printf(,“,%dt,”,pi,);,结论:,pi=*(p+i)=ai=*(a+i),a0=15,a1=13,a2=8,a3=7,a4=9,a5=10,p=,p+1=,p+2=,p+3=,p+4=,p+5=,a(1001),a+1,a+2,a+3,a+4,a+5,指针引用数组元素,main(),int a6=15,13,8,7,9,10;,int i,*p=a;,for(i=0;i6;i+),printf(,“,%dt,”,*(a+i),);,for(;pa+6;p+),printf(,“,n%dt,”,*p,);,for(i=0;i6;i+),printf(,“,n%dt,”,a+,);,a,是数组首地址,为常量,不能自加,a0=15,a1=13,a2=8,a3=7,a4=9,a5=10,p=,p+1=,p+2=,p+3=,p+4=,p+5=,a(1001),a+1,a+2,a+3,a+4,a+5,指针引用数组元素,int a5,i,*p;,for(p=a,i=0;i5;i+),scanf(,“,%d,”,p+);,for(p=a;pa+5;p+),printf(,“,%d,”,*p);,p=a,a+1,a+2,a+3,a+4,a0,a1,a2,a3,a4,注意指针变量当前值:,for(i=0;i5;i+),printf(,“,%d,”,*p+);,(p=a,i=0;i5;i+),利用指针变量赋值:,注意下标不可出界,p,p,p,p,指针引用数组元素,1.p+,或,p+=1,使,p,指向下一个元素,2.*p+,由于*,,+,运算符属于同一级别,结合方向从右到左,,等价于*,(p+),先引用后增值,先求*,p,再增值。即:*,p;p+;,3.,区分*,(p+),和*,(+p),4.,(*p)+,表示将,p,所指向的元素的,元素值,加,1,但是书上描述错误:,(*p)+!=(a0)+,5.,若,p,指向,ai,*(p-)=ai-;*(-p)=a-i;*(+p)=a+i,;,注意指针变量的运算:,描述错误,指针与数组引用,数组名作为函数参数:数组名代表数组的起始地址,void change(int p),int t;,t=p0;p0=p1;p1=t;,main(),void change(,int p,);,int a2=4,9;,change(a);,printf(,“,%d,%d,”,*a,*(a+1);,4,9,&a1,&a0,&p1,&p0,p=a,a,a+1,p,4,9,p+1,指针与数组引用,数组名作为函数参数:数组名代表数组的起始地址,void change(,int*p,),int t;,t=*p;*p=*(p+1);*(p+1)=t;,main(),void change(,int *p,);,int a2=4,9;,change(,a,);,printf(,“,%d,%d,”,*a,*(a+1),;,4,9,&a1,&a0,&p1,&p0,p=a,a,a+1,p,p+1,4,9,指针与数组引用,数组名作为函数参数:数组名代表数组的起始地址,void sum(int,p,int n),int I,total=0;,for(I=0;In;I+,p+,),total+=,*p,;,Printf(,“,%d,”,total);,main(),void sum(int*p int n);,int a6=3,4,9,8,7,10;,sum(a,6);,p=a,a(1001),a+1,a+2,a+3,a+4,a+5,3,4,9,8,7,10,int *p,p=,p+1=,p+2=,p+3=,p+4=,p+5=,指针与数组引用,void sum(int,*p,int n),int,*t=p,sum=0;,for(;t,p+n,;t+),sum+=,*t,;,Printf(,“,%d,”,sum);,main(),void sum(int*p int n);,int a6=3,4,9,8,7,10;,Int *pa=a;,sum(pa,6);,a(1001),a+1,a+2,a+3,a+4,a+5,3,4,9,8,7,10,int p,t=p=pa=,t+1=,t+2=,t+3=,t+4=,t+5=,子函数中改变实参元素值,1.,实参与形参都用数组名,想在函数中改变实参数组元素的值,实参与形参对应关系如下:,int sum(int,x,int n),更改数组,x,的元素值,main(),Int sum(int x int n);,int a4=3,4,9,8;,;,sum(,a,4);,;,a(1001),a+1,a+2,a+3,3,4,9,8,x=1001,x+1,x+2,x+3,子函数中改变实参元素值,2.,实参用数组名,形参用指针变量,int sum(int *p,int n),更改指针所指对象的值,main(),Int sum(int p int n);,int a4=3,4,9,8;,;,sum(a,4);,;,a(1001),a+1,a+2,a+3,3,4,9,8,p=1001,p+1,p+2,p+3,子函数中改变实参元素值,3.,实参与形参都用指针变量,int sum(int *p,int n),main(),int sum(int p int n);,int a4=3,4,9,8;,int *pa=a;,sum(pa,4);,;,pa=a(1001),a+1,a+2,a+3,3,4,9,8,p=1001,p+1,p+2,p+3,子函数中改变实参元素值,4.,实参用指针变量,形参用数组名,int sum(int p,int n),main(),int sum(int p int n);,int a4=3,4,9,8;,int *pa=a;,sum(pa,4);,;,pa=a(1001),a+1,a+2,a+3,3,4,9,8,p=1001,&p1,&p2,&p3,main(),int i,a5,*p;,for(i=0;i5;i+),scanf(,“,%d,”,p+);,指针与数组引用,main(),int i,a5;,for(i=0;i5;i+),scanf(,“,%d,”,a+);,指针数组错误使用举例:,a+,中,a,是常量,只是,s,数组首地址,是一个具体值,不能自加,只有变量才能自加,P,没有初始化,即:没有确定,p,所指向的对象,也就没有分配内存空间,scanf(,“,%d,”,a+i),int i,a5,*p=a;,U2,.U20,U21,U22,U23,U0,.U00,U01,U02,U03,U1,.U10,U11,U12,U13,多维数组与指针,如:,int U34,表示:定义,U,为,3,行,4,列,的数组,U,a,.a0,a1,a2,a3,b,.b0,b1,b2,b3,t,.t0,t1,t2,t3,第,0,列,第,1,列,第,2,列,第,3,列,第,0,行,第,1,行,第,2,行,多维数组与指针,int u34=,1,3,5,7,9,11,6,8,10,12,14,16,;,1,3,5,7,9,11,6,8,10,12,14,16,u0,u1,u2,&,u0,0,&,u0,1,&,u0,2,&,u0,3,1,3,5,7,9,11,6,8,10,12,14,16,u2=2016,u1=2008,u0=2000,t,b,a,多维数组与指针,int u34=1,3,5,7,9,11,6,8,10,12,14,16;,1,3,5,7,9,11,6,8,10,12,14,16,分 析:,设,u0,u1,u2,分别为一个一维数组的数组名,即首地址。,对于一维数组,u1,,,b=u1=*(u+1),b+0,=u1+0=&u10=*(u+1)+0,为第,0,列元素地址,b+1,=u1+1=&u11=*(u+1)+1,为第,1,列元素地址,b+2,=u1+2=&u12=*(u+1)+2,为第,2,列元素地址,b+3,=u1+3=&u13=*(u+1)+3,为第,3,列元素地址,推:,ui+j=&uij=*(u+i)+j,为第,I,行,j,列元素地址,u1+0,u1+1,u1+2,u1+3,b+0,b+1,b+2,b+3,多维数组与指针,int u34=1,3,5,7,9,11,6,8,10,12,14,16;,(2000),1,(2002),3,(2004),5,(2006),7,(2008),9,(2010),11,(2012),6,(2014),8,(2016),10,(2018),12,(2020),14,(2022),16,u,u+1,u+2,u0+0,u0+1,u0+2,u0+3,1,3,5,7,9,11,6,8,10,12,14,16,对于二维数组:,u+1=u1=*(u+1),都代表第二行第,0,个元素地址,但,u+1,表示行地址,,u1=*(u+1),都表示列地址,u,u+1,u+2,多维数组与指针,(2000),1,(2002),3,(2004),5,(2006),7,(2008),9,(2010),11,(2012),6,(2014),8,(2016),10,(2018),12,(2020),14,(2022),16,u,u+1,u+2,表示形式,含义,地址,u,二维数组名,指向一维数组,u0,,即第,0,行首地址,2000,u0,*(u+0),*u,第,0,行,第,0,列,元素地址,2000,u+1,&u1,第,1,行首地址,2008,u1,*(u+1),第,1,行,0,列元素,u10,的地址,2008,u1,+2,*(u+1),+2,&u12,第,1,行,2,列元素,u12,的地址,2012,*(,u1,+2),*(,*(u+1),+2),u12,第,1,行,2,列元素,u12,的值,值,6,指针与二维数组引用,main(),int a34=1,3,5,7,9,11,13,15,17,19,21,23;,int *p;,for(,p=a;pa0+12;p+,),if(,p-a0)%4=0,),printf(,“,n,”,);,printf(,“,%4d,”,*p);,用指针变量输出数组元素:,a,为行向量地址,,a0,为列向量,,a+i,一行一行移动,,a0+j,一列一列移动,pa+12,?,1 3 5 7,9 11 13 15,17 19 21 23,a0+0,a0+1,a0+2,a0+3,a+0,a+1,a+2,p=a0;,多维数组与指针,int a34=1,3,5,7,9,11,6,8,10,12,14,16;,2000,1,2002,3,2004,5,2006,7,2008,9,2010,11,2012,6,2014,8,2016,10,2018,12,2020,14,2022,16,a,a+1,a+2,1,3,5,7,9,11,6,8,10,12,14,16,a,a+1,a+2,(p=a0)=(p=a),p,p,p,p,指针与二维数组引用,main(),void aver(float*p,int n);,float a34=1,3,5,7,9,11,13,15,17,19,21,23;,aver(*a,12);,用指向数组的指针作参数:,1 3 5 7,9 11 13 15,17 19 21 23,void aver(float *p,int n),float *t=p+n,sum;,for(;pt;p+),sum+=*p;,printf(,“,%5.2f,”,sum/n);,aver(a0,12);,或,aver(a,12),指针与二维数组引用,main(),int a34=1,3,5,7,9,11,13,15,17,19,21,23;,int,(*p),4,i,j;,p=a,;,for(i=0;i3;i+),for(j=0;j3;j+),printf(,“,a%d%d=%d,”,i,j,*(,*(p+i),+j);,用指针变量输出二维数组元素:,p,指向一个,每个元素包含,4,个元素,的一维数组,称为数组指针,1 3 5 7,9 11 13 15,17 19 21 23,p=a,(p+)=a+1,(p+)=a+2,a3 4,*p,4,*(pi+j)=*(&,pij,)=pij=aij,指针与二维数组引用,main(),void search(int,(*p)4,int n);,int a34=1,3,5,7,9,11,13,15,17,19,21,23;,search(,a,2);,用指向数组的指针作参数:,void search(int,(*p)4,int n),int i;,for(i=0;i4;i+),printf(,“,%5.2f,”,*(,*(p+n),+i);,pn+i=&pni,学生各科成绩根据序号输出,1 3 5 7,9 11 13 15,17 19 21 23,main(),char str=,“,welcom,”,;,char a 20,i;,for(i=0;istrlen(str);i+),ai=*(str+i);,ai=,0,;,指 针 与 字 符 串,main(),char *str=,“,welcom,”,;,printf(,“,%s,”,str);,字符串数组对元素操作时同样转化为指针形式,字符串的初始化仅仅是将字符串的,首地址赋值给,str,,对于,stri,系统解析为:,*,(str+i),。,for(i=0;,*(str+i)!=,0,;i+),*(a+i)=*(str+i);,ai=,0,;,stri;,stri;,main(),char str=,“,welcom,”,;,char a20,*ps=str,*pa=a;,for(;,*ps!=,0,;),*pa+=*ps+;,*pa=,0,;,printf(,“,string a:%s,”,pa=a);,指 针 与 字 符 串,字符串数组与指针的变通使用,for(pa=a;,pay?x:y);,(*p)();,(*p)(a,b);,p=max;,指向函数的指针,main(),int max(int x,int y);,int a,b,c,(*p)(),;,scanf(,“,%d%d,”,a,b);,p=max,;,c=,(*p)(a,b),;,printf(,“,%d%dtmax=%d,”,a,b,c);,int max(int x,int y),语句,1,语句,2,语句,3,语句,n,p=max,函数指针,p,只能指向函数的首地址,不能通过*,(p+1),之类的相关运算使,p,指向函数中的某一条语句,指向函数的指针,1.(*p)(),仅仅是一指向函数的指针。它可以指向不同的函数,但是,所可能指向的函数,的数据类型必须相同它可以先后指向,返回的数据类型相同,的不同的函数,2.,给函数指针赋值时,仅仅给出函数名,决不能带参数。如:,p=max;,决不能:,p=max(a,b);,3.,用,函数指针变量,调用函数时,只需将,(*p),代替函数名即可(,p,为指针变量名);然后按照函数的格式加上实参,4.,函数指针,p,只能指向函数的首地址,不能通过*,(p+1),之类的相关运算使,p,指向函数中的某一条语句,象,p+,p+n,等操作一律非法,指向函数的指针,main(),int max(int x,int y);,int min(int y,int y);,int add(int y,int y);,int process(int x,int y,int,(*fun),(int,int),int a,b,(*p)();,scanf(,“,%d%d,”,p=process;,(*p)(a,b,max);,(*p)(a,b,min);,(*p)(a,b,add);,int max(int x,int y),int min(int x,int y),int add(int x,int y),int process(int x,int y,int,(*fun)(int,int),),int result;,result=,(*fun)(x,y),;,printf(,“,%d,”,result),;,函数入,口地址,返回指针值的函数,定义:返回的值的类型为指针类型,指针函数,格式:数据类型,*函数名,(,参数类型 参数,),如:,int,*sum,(int a ,int n),说明:,1.,(),的优先级高于,*,的优先级,因此,sum,先与,(,int a,int n),结合,后与,*,号结合,2.,函数调用后将得到一个指向整型数据的,指针,(,地址,),返回指针的函数,main(),float s 4=60,70,80,90,50,85,70,90,30,50,75,70;,float *search,(float(*p)4,int n);,float,*pt,;,int i,num;,printf(,“,学生序号为,:,”,),;,scanf(,“,%d,”,pt=search(s,num);,printf(,“,第,%d,学生成绩,:,”,num),;,for(i=0;i4;i+),printf(,“,%5.2ft,”,*(pt+i),;,float*search(,float(*p)4,int n),float,*pt;,pt=*(p+n),;,return,(pt),;,60 70 80 90,50 85 70 90,30 50 75 70,p,p+1,p+2,输出指定序号的学生成绩,返回指针的函数,main(),float s 4=60,70,80,90,50,85,70,90,30,50,75,70;,float *search(,float (*p)4,);,float *ps,;,int i,j;,for(i=0;i3;i+),ps=search(s+i);,if(ps=*(s+i),printf(,“,nno.%d:,”,i);,for(j=0;j4;j+),printf(,“,%5.2ft,”,*(ps+j),;,float *search(,float(*p)4,),int I;,float,*pt=*(p+1),;,for(I=0;I4;I+),if(*(*p+I)60),pt=p;,return,(pt),;,60 70 80 90,50 85 70 90,30 50 75 70,p,p+1,p+2,输出不及格学生的成绩和序号,返回指针的函数,main(),float *search(,float(*p)4,);,float *ps;,for(i=0;i3;i+),ps=search(s+i);,if(ps=*(s+i),printf(,“,nno.%d:,”,i);,for(j=0;j4;j+),printf(,“,%5.2ft,”,*(ps+j),;,float *search(,float(*p)4,),int I;,float,*pt=*(p+1),;,for(I=0;I4;I+),if(*(*p+I)60),pt=p;,return,(pt),;,60 70 80 90,50 85 70 90,30 50 75 70,50 85 70 90,p,p+1,pt,pt,有不及格时,没有不及格时,p,p,p,指 针 数 组,定义:数组中每一元素都是指针,/,地址,分别指向另一个对象(变量、数值、字符串、函数等),即:数组中的每一个元素是一个指针变量,格 式:,数据类型,*数组名,数组长度,如:,int *p5,说 明:,1.,的优先级高于,*,的优先级,因此,p,先与,结合,形成,p5,,然后与,*,号结合,2.,每一个元素都是指向整型变量的指针,3.,适用于指向多维字符串,数组指针与指针数组,int a34=,;,int (*p)4,;,p=a;,数组指针:,p,指向而且只能指向一个包含,4,个整型元素的一维数组,它是一维数组的首地址。,1 3 5 7,9 11 13 15,17 19 21 23,p=a,p+1=a+1,p+2=a+2,a3 4,*p,4,char,*,p4,;,指针数组:包括四个指针元素。分别为:,指针,p0,、指针,p1,、指针,p2,、指针,p3,char a5=,“,.,”,b6=,“,.,”,;,char s8=,“,.,”,t9=,“,.,”,;,p0=a;p1=b;,p2=s;p3=t;,for(i=0;i=3;i+),puts(pi);,二维字符串数组与指针数组,1.,字符串本身就一个数组,2.,只有设计二维字符串数组可以存放多个字符串,3.,二维数组每一行的元素个数相等,4.,每一个字符串的长度不一定一样,5.,因此,定义二维字符串数组时,对于比较短的字符串仍按照定义的固定列宽开辟空间,这样会造成内存单元的浪费,定义二维字符串数组的问题分析:,字 符 串 指 针 数 组,c,h,i,n,e,s,e,0,0,j,a,p,a,n,0,0,0,0,g,e,r,m,a,n,0,0,0,u,s,a,0,0,0,0,0,0,str0,str1,str2,str3,char str49=,“,chinese,”,“,japan,”,“,german,”,“,usa,”,for(i=0;i=3;i+),printf(,“,第,%d,个国家名称为:,%s,”,i+1,stri,;,p1,p2,p3,p4,p0=,“,china,”,;p1,=,“,japan,”,;,p2=,“,german,”,;p3,=,“,usa,”,;,字 符 串 指 针 数 组,str0,str1,str2,str3,char *,str4,=,“,chinese,”,“,japan,”,“,german,”,“,usa,”,0,e,s,e,n,i,h,c,0,n,a,p,a,j,0,n,a,m,r,e,g,0,a,s,u,for(i=0;i=3;i+),printf(,“,第,%d,个国家名称为:,%s,”,i+1,stri,;,p0,p1,p2,p3,str0=,“,china,”,;,str1=,“,japan,”,;,str2=,“,german,”,;,str2=,“,usa,”,;,str0,str1,str2,str3,字 符 串 指 针 数 组,main(),void sort(char,*p,int n);,void print(char,*p,int n);,char,*str4,=,“,chinese,”,“,japan,”,“,german,”,“,usa,”,sort(str,4);,print(str,4);,void sort(char,*p,int n);,char *t;int i,j,k;,for(i=0;in-1;i+),k=i;,for(j=i+1;j0)k=j;,if(k!=i)t=pi;pi=pk;pk=t;,对多个字符串排序,可以认为,p,的类型为:,char*,字 符 串 指 针 数 组,main(),void sort(char*p,int n);,void print(char*p,int n);,char *str4=,“,chinese,”,”,japan,”,”,german,”,”,usa,”,sort(str,4);,print(str,4);,void print(,char*p,int n);,int i=0;,while(in),printf(,“,%sn,”,pi+);,*(p+i+),打印多个字符串,stri,*(str+i),分别令,str+0;str+1;str+2;str+3,为,p0,p1,p2,p3,,,字 符 串 指 针 数 组,main(),char *str4=,;,print(str,4);,void print(,char*,p,int n);,printf(,“,%sn,”,pi+,);,分析:,stri,*(str+i),,分别令,str0;str1;str2;str3,为,p0,p1,p2,p3,。,p0=str0,p1=str1,p2=str2,p3=str3,0,e,s,e,n,i,h,c,0,n,a,p,a,j,0,n,a,m,r,e,g,0,a,s,u,指 向 指 针 的 指 针,char *str4=,“,chinese,”,”,japan,”,”,german,”,”,usa,”,printf(,“,%sn,”,stri+);,二维指针:,char *p=str;,printf(,“,%o,”,*p);,printf(,“,%s,”,*p);,str0,str1,str2,str3,*str4,*p,0,e,s,e,n,i,h,c,0,n,a,p,a,j,0,n,a,m,r,e,g,0,a,s,u,p,&stri,&p,char *p;,p=str;,结论:,p+i,分别指向,stri,,为每一行的首地址,是行向量,指 向 指 针 的 指 针,main(),char *str4=,“,chinese,”,”,japan,”,”,german,”,”,usa,”,char *p;,int i;,for(i=0;i5;i+),p=str+i;,printf(,“,%s,”,*p);,存储第,i,行首地址的指针变量,取,p,中存储的第,i,行的首地址,指 向 指 针 的 指 针,main(),char a=,“,chinese,”,*pa=a;,char b=,“,japan,”,*pb=b;,char c=,“,german,”,*pc=c;,char d=,“,usa,”,*pd=d;,char *str4=pa,pb,pc,pd;,char *p=str;int i;,for(i=0;i file China Beijing,4.,文件名应包含路径,如果在当前路径下可以不写路径,格 式:,main(int argc,char *argv ),指针数组作,main(),形参,例:,C:file China Beijing,5.,形参,argc,指命令行中的所有参数个数(字符串个数),包括命令名。如上:,argc=3,6.,命令行中的参数都是字符串,“,file,”,“,china,”,7.,所有字符串首地址构成一个指针数组写入,argv,中,刚开始时,,argv,指向第一个字符串:,file,argv0,argv1,argv2,argv,格 式:,main(int argc,char *argv ),0,a,n,i,h,C,0,g,n,i,j,i,e,B,0,e,l,i,f,/*print.c*/,main(int argc,char *argv),while(argc-1),printf(,“,%sn,”,*+argv),;,指针数组作,main(),形参,argv,C:,print china japan usa,*(argv+1),argv=argv+1;,*argv;,China,Japan,usa,0,t,n,i,r,p,0,a,n,i,h,c,0,n,a,p,a,j,0,a,s,u,argv0,argv1,argv2,argv2,/*print.c*/,main(,int argc,char *argv,),int i;,for(i=1;iargc;i+),printf(,“,%s%c,”,argv
展开阅读全文