九章指针课件_第1页
九章指针课件_第2页
九章指针课件_第3页
九章指针课件_第4页
九章指针课件_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章指针本章要点:了解地址与指针的概念熟练掌握指针变量的定义、初始化及指针的运算掌握指针与数组、指针数组、二级指针等知识熟练掌握字符串的指针与指向字符串的指针变量了解指针与函数的概念掌握指针作为函数参数的运用了解多维数组指针的概念指针是C言语中最重要的组成部分。利用指针可以表示复杂的数据构造;动态分配内存;灵敏处置字符串和数组;直接处置内存地址;从函数调用中获取多个值等。对变量值的存取本质上是经过地址进展的。表示图9.1指针的概念C言语中,任何一个变量名本质上都代表着内存中的某一个存储单元,每一个存储单元都有一个地址。C系统能自动将变量名和它的地址联络起来。变量定义及内存分配实例对变量的两种访问方式:直接访问和间接访问inti,j,k;i=3;j=6;k=9;那么编译时系统分别为i,j,k各分配2个字节。如:2000,2019i2019,2019j2019,2019k例图

内存用户数据区36920002000201920193010…………变量i变量j变量k变量i_pointer如:inti=3;printf(“%d〞,i);

执行是:根据变量名i找到i的地址(如:2000),然后从地址2000开场的两个字节中取出数据(即变量的值3),再将其输出。这种据变量名按变量地址存取变量的值的方式叫“直接访问〞方式。阐明重点2000i3inti=3;表示将3送到变量i所占的内存单元中重点C言语允许定义和运用一种特殊的变量,这种变量专门用于存放其它变量的地址。如前面的变量i_pointer。如果把变量i的地址赋给i_pointer,即i_pointer=&i。这样就可以经过变量i_pointer获取变量i的地址,然后再取出i的值。这种方式叫“间接访问〞方式。如下图:20002000i_pointer3将3送到变量i_pointer所指向的内存单元中i

指针:一个变量的地址叫该变量的“指针〞。指针变量:用于存放其它变量的地址的变量。指向:如i_pointer=&i,就称i_pointer指向变量i目的变量:指针变量所指向的变量。有关指针的几个概念:阐明:1.类型阐明符表示指针变量所指向的变量的类型,同类型变量的地址才干放到指向该类型变量的指针变量中。例如2.不能把一个整型量或任何其它非地址类型的数据赋给一个指针变量。例如例如一实例二9.2变量的指针和指向变量的指针变量一、指针变量的定义格式:类型阐明符*标识符如:int*pointer_1,*pointer_2;float*fp1,*fp2;例例&i&jpointer_1pointer_2ij如:inti,j,*pointer_1,*pointer_2;假设:pointer_1=&i;pointer_2=&j;那么:flaotf1;int*p;p=&f1;(不正确)例如:int*p;p=100;(不合法)但:p=NULL或p=0或p=‘\0’那么是合法的,都表示为指针赋了“空值〞。这并不意味着p指向地址为0的单元,而是不指向任何单元,但p中有确定的值。例二、指针变量的援用例9.1main(){inta,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;printf(“%d,%d\n〞,a,b);printf(“%d,%d\n〞,*p1,*p2);}结果:100,10100,10

&a&b10010p1p2ab*p1*p2“直接访问〞方式“间接访问〞方式关于&与*运算符的阐明:1:&是取地址运算符。例如2.&,*,++,––同优先级,按从右至左方向结合。

例如1例如2例如3如:inta,*p1,*p2;p1=&a;那么:&*p1与&a等效p2=&*p1;或p2=&a;那么:p2也指向变量a例子如:&a,&b等。*是指针运算符。用于定义时表示其后的标识符是指针变量。而在程序中*p那么表示指针变量p所指向的变量,即目的变量。例子例子如:inta,*p1;p1=&a;那么:*&a与*p1等效,即等价于变量a。&ap1*p1*&aa如:inta,*p1;p1=&a;那么:(*p1)++等价于a++但留意*p1++不等价于(*p1)++由于*p1++等价于*(p1++)即先得p1所指向变量的值,再使指针变量p1的值自增。例子例9.2main(){int*p1,*p2,*p,a,b;scanf(“%d,%d〞,&a,&b);p1=&a;p2=&b;if(a<b){p=p1;p1=p2;p2=p;}printf(“a=%d,b=%d\n〞,a,b);printf(“max=%d,min=%d\n〞,*p1,*p2);}如输入:5,9输出:a=5,b=9max=9,min=5数据指针交换表示图本卷须知进展地址交换本程序是采用交换变量a和b的地址来实现两个数的比较的。且比较前后a,b的值并未发生变化重点重点&a&b59&b&a95p1p2ppp1p2abab交换前交换后三、指针变量作为函数的参数函数调用时,把实践参数的值传送给方式参数。指针变量可以作实践参数,其作用也是将实践参数的值传送给方式参数,这个时候的值代表是将一个变量的地址,把地址传送给被调函数的方式参数。例9.3swap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b,*pointer_1,*pointer_2;scanf(“%d,%d〞,&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf(“\n%d,%d\n〞,a,b);}交换目的变量,即值的交换假设输入:5,9输出为:9,5&a&b59abpointer_1pointer_2&a&b&a&b59abp1p2pointer_1pointer_2&a&a&b&b95p1pointer_1p2pointer_2ab&a&b95abpointer_1pointer_2(a)(b)(c)(d)本程序采用的是交换a和b的值,而p1和p2的值不变。同例9.2相反.假设把swap函数改成:swap(int*p1,int*p2){int*p;*p=*p1;*p1=*p2;*p2=*p;}

此句有问题swap(intx,inty){intt;t=x;x=y;y=t;}55995995abxyabxy(a)(b)main(){inta,b;scanf(“%d,%d〞,&a,&b);if(a<b)swap(a,b);printf(“\n%d,%d\n〞,a,b);}阐明:1.如想经过函数调用得到n个要改动的值。(1)在主调函数中设n个变量,并用n个指针变量指向它们。(2)将指针变量作实参,使n个变量的地址传给所调用的函数形参。(3)经过形参指针变量,改动该n个变量的值。(4)主调函数中就可以运用这些改动了值的变量。2.不能经过改动形参指针变量本身的值而使实参指针变量的值改动。&ap1&aq1函数调用时&bq1在被调函数中3.可以经过改动形参指针变量所指向的变量的值来改变实参指针变量所指向的变量的值。5a&ap1&aq1补例1:voidpoint(int*q1){q1+=2;}main(){int*p1,a=4;p1=&a;point(p1);printf(“%d\n〞,*p1);}

4a&ap1&aq1补例2:voidpoint(int*q1){*q1+=2;}main(){int*p1,a=4;p1=&a;point(p1);printf(“%d\n〞,*p1);}swap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}main(){inta,b,*pointer_1,*pointer_2;scanf(“%d,%d〞,&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf(“\n%d,%d\n〞,a,b);}本函数中试图经过改动形参指针变量的值来使实参指针变量的值改动a&a&b59bpointer_1pointer_2(a)&a&b59abp1p2(b)&b&a59abp1p2(c)a&b&a59bpointer_1pointer_2(d)&a&b59abpointer_1pointer_2(d)exchange(int*q1,int*q2,int*q3){if(*q1<*q2)swap(q1,q2);if(*q1<*q3)swap(q1,q3);if(*q2<*q3)swap(q2,q3);}例9.4swap(int*pt1,int*pt2){intp;p=*pt1;*pt1=*pt2;*pt2=p;}main(){inta,b,c,*p1,*p2,*p3;scanf(“%d,%d,%d〞,&a,&b,&c);p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);printf(“\n%d,%d,%d\n〞,a,b,c);}运转如下:9,0,1010,9,09010p1abcp2p39010q1bcq2q3aexchange90pt1bpt2aswapp1q1p19.3数组的指针和指向数组的指针变量C言语中,指针变量可以指向变量,也可以指向数组和数组元素。数组的指针:数组的起始地址(首地址)数组元素的指针:数组元素的地址一、指向一维数组的指针变量的定义与赋值指向数组的指针变量的定义同指向变量的指针变量的定义一样。如:inta[10];int*p;假设:p=&a[0];那么p指向了a数组的第0号元素。由于数组名代表数组的首地址(即起始地址),故:p=&a[0];等价于p=a;也可:inta[10];int*p=&a[0];int*p=a;留意int*p=&a[0];的含义是将数组的首地址赋给指针变量p,而不是赋给(*p)。二、经过指针援用数组元素如:inta[10],*p;p=a;那么:(1)pa[0]的地址p+1a[1]的地址p+ia[i]的地址(2)*p==a[0],*(p+1)==a[1],…*(p+i)==a[i]阐明:1.数组元素在内存中是延续存放的,C言语规定,指针变量p+1指向下一个元素(不是简单的加1)如数组元素为实型,那么p+1所表示的实践地址是p+1d=p+14(d为一个数组元素所占的字节数)&a[0]13…20a[0]a[1]a[9]p2.(p+i)表示指向a[i]的地址,而a+i也表示a[i]的地址,故程序中(p+i)等价于a+i。如:p+2;a+2;3.指向数组的指针变量可以带下标。如:p[i]*(p+i)综上所述:数组元素的援用可以:(1)下标法:数组名[下标]或指针变量名[下标](2)指针法:*(p+i)或*(a+i)(假定:inta[10],*p=a;)a数组pp+1,a+1p+i,a+ip+9,a+9a[0]a[1]a[i]a[9]*(p+i)例9.5用三种方法输出数组各元素。

(1)下标法main(){inta[10],i;for(i=0;i<10;i++)scanf(“%d〞,&a[i]);printf(“\n〞);for(i=0;i<10;i++)printf(“%d〞,a[i]);}(2)用数组名计算元素地址main(){inta[10],i;for(i=0;i<10;i++)scanf(“%d〞,&a[i]);printf(“\n〞);for(i=0;i<10;i++)printf(“%d〞,*(a+i));}(3)用指针变量指向数组元素main(){inta[10],i,*p;for(i=0;i<10;i++)scanf(“%d〞,&a[i]);printf(“\n〞);for(p=a;p<(a+10);p++)printf(“%d〞,*p);}留意几点:(1)指针变量可以作自增,自减运算。如:++p,p––而数组名不能作自增,自减运算。如:a++,––a等均不合法。由于数组名是常量。(2)留意指针变量的当前值。如:例9.6main(){inta[10],i,*p;p=a;for(i=0;i<10;i++)scanf(“%d〞,p++);printf(“\n〞);for(i=0;i<10;i++,p++)printf(“%d〞,*p);}

for(i=0,p=a;i<10;i++,p++)或for(p=a;p<a+10;p++)pa数组(3)留意指针变量的运算如:inta[10],i,*p;p=a;那么:a.p++(或p+=1)表示p指向a[1],此时假设执行*p那么取出a[1]元素的值。b.“*〞与“++〞同优先级,自右往左结合。如:*p++等效于*(p++),即先取p所指向变量的值,再使p+1。而*(p++)与*(++p)的作用不同。前者先取*p的值,后使p+1;后者是先使p+1,再取*p的值。c.(*p)++表示使目的变量的值加1。而不是指针变量的值加1d.*(p++)等价于a[i++]*(++p)等价于a[++i]即先使p自增,再作*运算。如:main(){inta[100],*p;p=a;while(p<a+100)printf(“%d〞,*p++);}main(){inta[100],*p;p=a;while(p<a+100){printf(“%d〞,*p);p++;}}三、数组名作函数参数数组名作函数参数时,实践上是将实参数组的首地址传给形参。这样实参数组与形参数组共占同一段内存。使得在调用函数过程中,形参数组中元素值发生变化也就使实参数组的元素值随之而发生变化。main()f(intarr[],intn){intarray[10];{……f(array,10);…………}}arrayarrvoidinv(intx[],intn){intt,i,j,m=(n–1)/2;for(i=0;i<=m;i++){j=n–1–i;t=x[i];x[i]=x[j];x[j]=t;}return;}可去掉

37911067542

24576011973imj例9.7将数组a中n个整数按相反顺序存放。即将第一个元素和最后一个元素对换,将第二个同倒数第二个对换.…….即两两对换,直到:a[(n–1)/2]与a[n–(n–1)/2–1]对换为止。voidmain(){staticinti,a[10]={3,7,9,11,0,6,7,5,4,2};printf(“Theoriginalarray:\n〞);for(i=0;i<10;i++)printf(“%d,〞,a[i]);printf(“\n〞);inv(a,10);printf(“Thearrayhasbeeninverted:\n〞);for(i=0;i<10;i++)printf(“%d,〞,a[i]);printf(“\n〞);}运转结果:Theoriginalarray:3,7,9,11,0,6,7,5,4,2Thearrayhasbeeninverted:2,4,5,7,6,0,11,9,7,3以上程序也可以改为如下:voidinv(int*x,intn){int*p,t,*i,*j,m=(n–1)/2;i=x;j=x+n–1;p=x+m;for(;i<=p;i++,j––){t=*i;*i=*j;*j=t;}return;}a数组a[0]a[1]…..a[9]370i,xp=x+mj24576119main(){staticinti,a[10]={3,7,9,11,0,6,7,5,4,2};printf(“Theoriginalarray:\n〞);for(i=0;i<10;i++)printf(“%d〞,a[i]);printf(“\n〞);inv(a,10);printf(“Thearrayhasbeeninverted:\n〞);for(i=0;i<10;i++)printf(“%d〞,a[i]);printf(“\n〞);}intmax,min;voidmax_min_value(intarray[],intn){int*p,*array_end;array_end=array+n;max=min=*array;for(p=array+1;p<array_end;p++)if(*p>max)max=*p;elseif(*p<min)min=*p;return;}等价于*(array+0)即array[0]例9.8从10个数中找出其中最大值和最小值voidmain(){inti,number[10];printf(“enter10data\n〞);for(i=0;i<10;i++)scanf(“%d〞,&number[i]);max_min_value(number,10);printf(“\nmax=%d,min=%d\n〞,max,min);}运转结果:enter10data–24680–3456789100max=100,min=–3此例也可改用指针变量来传送地址,程序可改为:intmax,min;voidmax_min_value(int*array,intn){int*p,*array_end;array_end=array+n;max=min=*array;for(p=array+1;p<array_end;p++)if(*p>max)max=*p;elseif(*p<min)min=*p;return;}

voidmain(){inti,number[10],*p;p=number;printf(“enter10data\n〞);for(i=0;i<10;i++,p++)scanf(“%d〞,p);printf(“the10data:\n〞);for(p=number,i=0;i<10;i++,p++)printf(“%d〞,*p);p=number;max_min_value(p,10);printf(“\nmax=%d,min=%d\n〞,max,min);}for(p=number;p<(number+10);p++)综上所述,对于实参数组想在被调函数中改动此数组元素的值,实参与形参的对应关系可以如下:(1)二者都用数组名main()f(intx[],intn){inta[10];{…………f(a,10);……}}特点:a和x数组共用同一段内存单元。(2)实参为数组名,形参用指针变量main()f(int*x,intn){inta[10];{…………f(a,10);……}}(2)实参为数组名,形参用指针变量main()f(int*x,intn){inta[10];{…………f(a,10);……}}特点:实参将数组的首地址传给形参指针变量,经过指针变量指向数组中的任一元素,进而作相应的处置。(3)二者都用指针变量main()f(int*x,intn){inta[10],*p;{p=a;…………f(p,10);……}}特点:先使p指向a数组,再将p传给x,使x也指向a数组,从而进展处置。(4)实参为指针变量,而形参为数组名main()f(intx[],intn){inta[10],*p;{p=a;…………f(p,10);……}}特点:利用指针变量将a数组的首地址传给x数组。使两数组共用同一段内存单元。利用x[i]值的变化,使a[i]的值也发生变化。留意:在上述四种处置方式中,当用指针变量作实参时,必需先使指针变量有确定的值,即指向一个已定义的数组。四、二维数组的指针和指向二维数组的指针变量1.二维数组和数组元素的地址C言语中二维数组实践上是由假设干个按行存放的一维数组构成的。如:inta[3][4];a[0]––a[0][0]a[0][1]a[0][2]a[0][3]a[1]––a[1][0]a[1][1]a[1][2]a[1][3]a[2]––a[2][0]a[2][1]a[2][2]a[2][3]a代表首元素的地址,而此时首元素a[0]又是一个包含有4个元素的一维数组。所以a(或a+0)表示二维数组第0行的地址。同理:a+1,a+2分别表示二维数组第1行和第2行的地址。所以,二维数组名是一个行指针。a[0],a[1],a[2]分别表示一维数组名,所以a[0]代表一维数组a[0]中第0列元素的地址,即&a[0][0]。a同理:a[1]的值为&a[1][0],a[2]的值为&a[2][0]。二维数组元素的地址可表示为:(1)&a[i][j](2)a[i]+j(3)*(a+i)+j(由于a[i]等价于*(a+i))二维数组元素的援用可表示为:(1)a[i][j](2)*(a[i]+j)(3)*(*(a+i)+j)2.指向二维数组的指针变量(1)指向二维数组的列指针变量inta[3][4],*p;如:p=a[0];或p=&a[0][0];p=*(a+0);p=*a;那么p是一个指向二维数组a第0行第0列元素的指针变量。(即p是一个列指针变量)此时p+1那么指向第0行第1列的元素。阐明:上述p=a[0];不能写成p=a;由于虽然a[0]和a都表示地址且值一样,但二者的地址基类型不同。即a[0]是一个列地址,而a是一个行地址。1357246811121314pp+1#include“stdio.h〞voidmain(){inta[3][4]={1,2,3,4,9,8,7,6,10,11,5,2};int*p=a[0];(或int*p=&a[0][0];)for(;p<a[0]+12;p++){if((p–a[0])%4==0)printf(“\n〞);printf(“%4d〞,*p);}}

(2)指向二维数组的行指针变量由于二维数组是由按行存放的一维数组构成,C语言中可以用行指针变量来援用二维数组元素。定义格式:数据类型(*标示符)[常量]如:int(*p)[4];表示p所指的对象是有4个整型元素的数组。inta[3][4],(*p)[4];假设:p=a;那么p是指向a数组第0行的指针变量,即p是一个行指针变量。此时,p+1那么指向a数组第1行,p+i那么指向a数组第i行。所以,*(p+i)+j表示a数组中第i行j列元素的地址。而*(*(p+i)+j)那么表示表示a数组中第i行j列元素的值。留意不能写成p=a[0]。1357246811121314pp+1例:输出二维数组恣意行恣意例元素的值。voidmain(){inta[3][4]={1,2,3,4,9,8,7,6,10,11,5,2};int(*p)[4],i,j;p=a;scnaf(“i=%d,j=%d〞,&i,&j);printf(“a[%d,%d]=%d\n〞,i,j,*(*(p+i)+j));}3.二维数组名和指向二维数组的指针变量作函数参数补充例:用函数调用方式编写程序找出二维数组a中每行的最小值并输出。要求:(1)二维数组元素的值用随机函数产生(0~50)之间(2)每行中元素的最小值在line_min()函数中求出。(3)在主函数中输出每行的最小值。

voidmain(){1、定义一个二维数组2、调随机函数对二维数组元素赋值3、调用line_min函数4、输出结果到屏幕}line_min(){1、接纳实参2、求二维数组每行中的最小值}方法一、用列指针来求解#include“stdlib.h〞#defineN3#defineM4voidmain(){inta[N][M],min,i,j;for(i=0;i<N;i++)for(j=0;j<M;j++){a[i][j]=random(50);printf(“%4d〞,a[i][j]);if((j+1)%4==0)printf(“\n〞);}for(i=0;i<N;i++){min=line_min(a[i]);printf(“a[%d]:min=%d\n〞,i,min);}}line_min(int*p){intj,min;min=*(p+0);for(j=1;j<M;j++)if(min>*(p+j))min=*(p+j);returnmin;}方法二、用行指针来求解#include“stdlib.h〞#defineN3#defineM4voidmain(){inta[N][M],min,i,j;for(i=0;i<N;i++)for(j=0;j<M;j++){a[i][j]=random(50);printf(“%4d〞,a[i][j]);if((j+1)%4==0)printf(“\n〞);}for(i=0;i<N;i++){min=line_min(a+i);printf(“a[%d]:min=%d\n〞,i,min);}}line_min(int(*p)[M]){intj,min;min=*(*p);for(j=1;j<M;j++)if(min>*(*p+j))min=*(*p+j);returnmin;}阐明:random(x)函数能产生一个(0~x–1)间的随机整数。相关的函数有:rand(),其功能是产生0~32767间的随机数。如:(rand()%90+10.0)/10.0就能产生1.0~10.0之间的实数。§9.4字符串的指针和指向字符串的指针变量字符串的指针就是字符串的首地址。一、字符串的表示方式1:用字符数组实现例9.16main(){staticcharstring[]=“ILoveChina〞;printf(“%s\n〞,string);}例中string是数组名,它表示字符数组的首地址。相应的string[i]表示数组中的一个元素。如:string[4]代表第5个元素,即字母v2:用字符指针实现char*string;string=“ILoveChina〞;或者:char*string=“ILoveChina〞;其含义是将字符串的首地址赋给指针变量string。虽然没有直接定义字符型数组,但实践上C言语对字符串常量均按字符数组来处置。即在内存中开辟了一个字符数组用来存放字符串常量。例9.17main(){char*string=“ILoveChina〞;printf(“%s\n〞,string);}留意:C言语中对字符串可以进展整体输入和输出。而对数值型数组那么不能用数组名来输出它的全部元素,只能逐个元素输出。对字符串的处置可以用下标法,也可用指针法。例9.18将字符串a复制到字符串b。main(){chara[]=“Iamaboy.〞,b[20];for(i=0;*(a+i)!=‘\0’;i++)*(b+i)=*(a+i);*(b+i)=‘\0’;printf(“stringais:%s\n〞,a);printf(“stringbis:〞);for(i=0;b[i]!=‘\0’;i++)printf(“%c〞,b[i]);printf(“\n〞);}运转结果:stringais:Iamaboy.stringbis:Iamaboy.例9.19用指针变量来处置例9.18问题.main(){chara[]=“Iamaboy.〞,b[20],*p1,*p2;inti;p1=a;p2=b;for(;*p1!=‘\0’;p1++,p2++)*p2=*p1;*p2=‘\0’;printf(“stringais:%s\n〞,a);printf(“stringbis:〞);for(i=0;b[i]!=‘\0’;i++)printf(“%c〞,b[i]);printf(“\n〞);}Iamaboy.\0ap1p1bp2p2二、字符串指针作函数参数用字符数组名和指向字符串的指针变量作函数参数,均可以处置字符串。例9.20用函数调用实现字符串的复制。I\0(1)用字符数组作函数参数voidcopy_string(charfrom[],charto[]){inti=0;while(from[i]!=‘\0’)(先判别,后赋值){to[i]=from[i];i++;}to[i]=‘\0’;}main(){chara[]=“Iamateacher.〞;charb[]=“youareastudent.〞;printf(“string_a=%s\nstring_b=%s\n〞,a,b);copy_string(a,b);printf(“\nstring_a=%s\nstring_b=%s\n〞,a,b);}运转结果:string_a=Iamateacher.string_b=youareastudent.string_a=Iamateacher.string_b=Iamateacher.本程序main函数中也可用字符型指针变量。改写如下:main(){char*a=“Iamateacher.〞;char*b=“youareastudent.〞;printf(“string_a=%s\nstring_b=%s\n〞,a,b);copy_string(a,b);printf(“\nstring_a=%s\nstring_b=%s\n〞,a,b);}(2)形参用字符指针变量voidcopy_string(char*from,char*to){for(;*from!=‘\0’;from++,to++)*to=*from;*to=‘\0’;}main(){char*a=“Iamateacher.〞;char*b=“youareastudent.〞;printf(“string_a=%s\nstring_b=%s\n〞,a,b);copy_string(a,b);printf(“\nstring_a=%s\nstring_b=%s\n〞,a,b);}(3)对copy_string函数的简化

a.voidcopy_string(char*from,char*to){while((*to=*from)!=‘\0’){from++;to++;}}即先赋值,后判别。故*to=‘\0’语句不要。b.voidcopy_string(char*from,char*to){while((*to++=*from++)!=‘\0’);}留意分号c.voidcopy_string(char*from,char*to){while(*from!=‘\0’)*to++=*from++;*to=‘\0’;}

d.voidcopy_string(char*from,char*to){while(*from)*to++=*from++;*to=‘\0’;}

*from!=‘\0’*from!=0while(*from!=0)e.voidcopy_string(char*from,char*to){while(*to++=*from++);}

f.voidcopy_string(char*from,char*to){for(;(*to++=*from++)!=‘\0’;);}

for(;*to++=*from++;);综上所述,用函数调用来处置字符串时,函数参数可以有以下几种情况:实参形参1.数组名数组名2.数组名字符指针变量3.字符指针变量字符指针变量4.字符指针变量数组名三、字符指针变量与字符数组的区别1.字符数组由假设干个元素构成,每一个元素中存放一个字符。而字符指针变量中存放的是字符串的首地址。绝非将字符串放在字符指针变量中。2.赋值方式可以不同。如:staticcharstr[]=“Hellow

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论