《谭浩强C语言课件第10章.ppt》由会员分享,可在线阅读,更多相关《谭浩强C语言课件第10章.ppt(88页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第十章第十章指针指针10.1指针的概念指针的概念指针(指针(pointer):是一):是一个变量的地址。个变量的地址。指针变量:是一个变量,指针变量:是一个变量,其值是另一个变量的地其值是另一个变量的地址。址。任何变量都在计算机内任何变量都在计算机内存中占有一块内存区域存中占有一块内存区域,变量的值就存放在这块变量的值就存放在这块内存区域之中内存区域之中一个变量的访问(访问是指取出其值或一个变量的访问(访问是指取出其值或向它赋值)方式有两种:向它赋值)方式有两种:(1)直接访问,通过变量名访问,如通)直接访问,通过变量名访问,如通过变量名过变量名i直接访问。直接访问。(2)间接访问,通过该变量
2、的指针来访)间接访问,通过该变量的指针来访问,如通过问,如通过i_pointer访问变量访问变量i。10.2变量的指针变量的指针一、指针变量的定义一、指针变量的定义指针变量有三个属性:指针变量有三个属性:(1)该指针变量指向的变量的类型。如)该指针变量指向的变量的类型。如i_pointer指向的指向的变量变量i是整型。是整型。(2)该指针变量在内存中占多少内存单元。如)该指针变量在内存中占多少内存单元。如i_pointer占两个内存单元,称为占两个内存单元,称为“近指针近指针”,用,用near表示。如果表示。如果该变量在内存中占该变量在内存中占4个内存单元,称为个内存单元,称为“远指针远指针”
3、,用,用far表示。如果未指定表示。如果未指定near或或far,缺省是,缺省是near。(指针。(指针变量在内存中要么占变量在内存中要么占2个内存单元,要么占个内存单元,要么占4个内存单元)个内存单元)。(3)该指针变量指向哪一个变量,即该指针变量的值是)该指针变量指向哪一个变量,即该指针变量的值是多少。如多少。如i_pointer的值是的值是2000。指针变量定义的一般形式:指针变量定义的一般形式:类型标识符类型标识符*标识符标识符如如:int*pointer_1,*pointer_2;例、例、int i,j;/*定义两个整型变量定义两个整型变量*/int*pointer_1,*point
4、er_2;float*pointer_3;char*pointer_4;void*pointer_5;指针变量的赋值:指针变量的赋值:例、例、pointer_1=&i;pointer_2=&j;注意,指针变量中只能存放地址,不能注意,指针变量中只能存放地址,不能将一个非地址类型的数据(如常数等)将一个非地址类型的数据(如常数等)赋给一个指针变量,如:赋给一个指针变量,如:pointer_1=100;也可以在定义指针变量的同时指定其初也可以在定义指针变量的同时指定其初值,值,如:如:inta;int*p=&a;二、指针变量的引用二、指针变量的引用有两个运算符可以引用指针变量:有两个运算符可以引用
5、指针变量:(1)&:取地址运算符。如:取地址运算符。如pointer_1=&i;(2)*:指针运算符。:指针运算符。用于访问指针变量所指向的变量。用于访问指针变量所指向的变量。*和和&是互逆运算是互逆运算例;例;i=3;直接访问直接访问 ptr=&i;*ptr=15;间接访问间接访问 说明:说明:1、在定义指针变量时,还未规定它指向哪、在定义指针变量时,还未规定它指向哪一个变量,此时不能用一个变量,此时不能用*运算符访问指针。运算符访问指针。只有在程序中用赋值语句具体规定后,只有在程序中用赋值语句具体规定后,才能用才能用*运算符访问所指向的变量。运算符访问所指向的变量。inta;int*p;(
6、未规定指向哪个变量未规定指向哪个变量)*p=100;这种错误称为访问悬挂指针这种错误称为访问悬挂指针(suspededpointer)。)。正确的引用:正确的引用:inta;int*p;(未规定指向哪个变量未规定指向哪个变量)p=&a;(规定指向规定指向a)*p=100;2、区分:、区分:*运算符在不同场合的作用,编运算符在不同场合的作用,编译器能够根据上下文环境判别译器能够根据上下文环境判别*的作用。的作用。inta,b,c;int*p;(*表示定义指针)表示定义指针)p=&a;*p=100;(*表示指针运算符)表示指针运算符)c=a*b;(*表示乘法运算符)表示乘法运算符)例例10.2输入
7、输入a和和b两个整数,按先大两个整数,按先大后小的顺序输出后小的顺序输出a和和b。main()int*p1,*p2,*p,a,b;scanf(%d,%d,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(a=%d,b=%dn,a,b);printf(max=%d,min=%dn,*p1,*p2);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;p1指向较大值,指向较大值,p2指向较小值指向较小值.程序说明:程序说明:三、指针变量作为函数的参数三、指针变量作为函数的参数例例10.3题目要求输入题目要求输入a和和b两个整数,两个整数
8、,按先大后小的顺序输出按先大后小的顺序输出a和和b。intswap(int*p1,int*p2)intp;p=*p1;*p1=*p2;*p2=p;main()inta,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);/*另一种调用另一种调用swap()的形式是:的形式是:if(ab)swap(&a,&b);*/printf(n%d,%dn,a,b);例例10.4输入输入a、b、c三个整数,按大小顺三个整数,按大小顺序输出。序输出。int
9、swap(int*pt1,int*pt2)intp;p=*pt1;*pt1=*pt2;*pt2=p;intexchange(int*q1,int*q2,int*q3)if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);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,%dn,a,b,c);10.3数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量指针可
10、以指向数组和数组元素,当一个指针可以指向数组和数组元素,当一个指针指向数组后,对数组元素的访问,指针指向数组后,对数组元素的访问,既可以使用数组下标,也可以使用指针。既可以使用数组下标,也可以使用指针。并且,用指针访问数组元素,程序的效并且,用指针访问数组元素,程序的效率更高。率更高。一、指向数组元素的指针变量一、指向数组元素的指针变量指向数组元素的指针变量,其类型应与数组元指向数组元素的指针变量,其类型应与数组元素相同,例、素相同,例、inta10;/*元素为整型元素为整型*/floatb10;/*元素为实型元素为实型*/int*p;/*可以指向数组可以指向数组a的元素的元素*/float*
11、pf;/*可以指向数组可以指向数组b的元素的元素*/为了让指针为了让指针p指向数组指向数组a,应把数组,应把数组a的地址赋的地址赋给指针变量给指针变量p。p=a;或;或p=&a0;或或int*p=a;二、通过指针引用数组元素二、通过指针引用数组元素当使指针当使指针p指向数组指向数组a后,可以用指针后,可以用指针p访问访问数组的各个元素。数组的各个元素。说明:如果指针说明:如果指针p指向数组指向数组a(指向数组的第一个元素(指向数组的第一个元素a0),则:),则:p+1指向指向下一个元素下一个元素a1,注意不是将,注意不是将p值简值简单加单加1。如果数组元素是整型,如果数组元素是整型,p+1表示
12、表示p的地址加的地址加2;如果数组元素是实型,如果数组元素是实型,p+1表示表示p的地址加的地址加4;如果数组元素是字符型,如果数组元素是字符型,p+1表示表示p的地址加的地址加1。p+i指向元素指向元素ai。可以使用。可以使用*(p+i)访问元素访问元素ai。另外:另外:1、p+i也可以记作也可以记作a+i。指向元素。指向元素ai。2、指向数组的指针变量也可以带下标,如,、指向数组的指针变量也可以带下标,如,pi与与*(p+i)等价,表示元素等价,表示元素ai。#includemain()inta=1,2,3,4,5,6,*p;p=a;*(p+3)+=2;printf(“%d,%dn”,*p
13、,*(p+3);A 0,5 B1,5C 0,6 D1,6例例10.5输出数组的全部元素。(设输出数组的全部元素。(设10个元素,整型)。个元素,整型)。方法一:方法一:1、下标法(常用,很直观)、下标法(常用,很直观)main()inta10;inti;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,ai);方法二;方法二;2、用数组名计算数组元素的地址。(效率与下、用数组名计算数组元素的地址。(效率与下标法相同,不常用)标法相同,不常用)main()inta10;inti;for(i=0;i10;i+)scanf
14、(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,*(a+i);方法三:方法三:3、用指针访问各元素。(常用,效率高)、用指针访问各元素。(常用,效率高)main()inta10;int*p,i;for(i=0;i10;i+)scanf(“%d”,&ai);printf(“n”);for(p=a;p(a+10);p+)printf(%d,*p);注意:注意:1、若指针、若指针p指向数组指向数组a,虽然,虽然p+i与与a+i、*(p+i)与与*(a+i)意义相同,但仍应注意意义相同,但仍应注意p与与a的区别的区别,a是地址常量,而是地址常量,而p是指针变量。
15、是指针变量。例、例、for(p=a;a(p+10);a+)a代表数组的首地址,是不变的代表数组的首地址,是不变的,a+不合法不合法2、指针变量可以指向数组中的任何元素,、指针变量可以指向数组中的任何元素,注意指针变量的当前值。注意指针变量的当前值。例例10.6输出数组输出数组a的的10个元素。个元素。程序:程序:main()int*p,i,a10;p=a;for(i=0;i10;i+)scanf(%d,p+);printf(n);for(i=0;i10;i+,p+)printf(%d,*p);printf(%d,*p);main()int*p,i,a10;p=a;for(i=0;i10;i+)
16、scanf(%d,p+);printf(n);p=a;for(i=0;i10;i+,p+)printf(%d,*p);3、使用指针时,应特别注意避免指针访使用指针时,应特别注意避免指针访问越界。在上例中,第二次问越界。在上例中,第二次for循环,循环,p已经越过数组的范围,但编译器不能发已经越过数组的范围,但编译器不能发现该问题。现该问题。4、指针使用的几个细节。、指针使用的几个细节。设指针设指针p指向数组指向数组a(p=a),则:),则:p+(或(或p+=1),),p指向下一个元素。指向下一个元素。*p+,相当于,相当于*(p+)。因为,。因为,*和和+同优先级,同优先级,+是右结合运算符。
17、是右结合运算符。*(p+)与)与*(+p)的作用不同。的作用不同。*(p+):先取:先取*p,再使,再使p加加1。*(+p):先使:先使p加加1,再取,再取*p。(*p)+表示,表示,p指向的元素值加指向的元素值加1。如果如果p当前指向数组当前指向数组a的第的第i个元素,则:个元素,则:*(p-)相当于相当于ai-,先取,先取*p,再使,再使p减减1。*(+p)相当于相当于a+i,先使,先使p加加1,再取,再取*p。*(-p)相当于相当于a-i,先使,先使p减减1,再取,再取*p。三、数组名作函数参数三、数组名作函数参数数组名代表数组首地址,因此,它作实数组名代表数组首地址,因此,它作实参在函
18、数调用时,是把数组首地址传送参在函数调用时,是把数组首地址传送给形参。这样,实参数组和形参数组共给形参。这样,实参数组和形参数组共占同一段内存区域。从而在函数调用后,占同一段内存区域。从而在函数调用后,实参数组的元素值可能会发生变化。实参数组的元素值可能会发生变化。例例10.7将数组将数组a中中n个元素按相反顺序存个元素按相反顺序存放。放。算法:算法:a0与与an-1交换,交换,a1与与an-2交换,交换,.,a(n-1)/2与与an-int(n-1)/2)交换。交换。实现:用实现:用i,j作元素位置变量,开始作元素位置变量,开始i=0,j=n-1。将。将ai与与aj交换,然后交换,然后i加加
19、1,j减减1,直到,直到i=(n-1)/2。voidinv(intx,intn)intt,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;t=ai;ai=aj;aj=t;return;main()staticinti,a10=3,7,9,11,0,6,7,5,4,2;printf(theoriginalarray:n);for(i=0;i10;i+)printf(%d,ai);printf(n);inv(a,10);printf(thearrayhansbeeninverted:n);for(i=0;i10;i+)printf(%d,ai);printf(n);函数函
20、数inv()可以用指针作形参,运行情可以用指针作形参,运行情况与用数组作形参相同。况与用数组作形参相同。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;例例10.8从从10个数中找出其中最大值和最小值。个数中找出其中最大值和最小值。只找出其中最大值和最小值,不能改变元素的只找出其中最大值和最小值,不能改变元素的排列顺序)。排列顺序)。方法方法1、实参和形参均用数组变量。、实参和形参均用数组变量。方方法法2、形形参参和和实实参参均均使使用用指指针针
21、变变量量。小结:数组作函数的参数,小结:数组作函数的参数,实参和形参之实参和形参之间传送数组的首地址间传送数组的首地址,首地址可以用指针,首地址可以用指针表示,也可以用数组名表示,因此,实参表示,也可以用数组名表示,因此,实参和形参有以下四种组合情况。和形参有以下四种组合情况。组合情况组合情况实参实参形参形参1数组名数组名数组名数组名2数组名数组名指针指针3指针指针指针指针4指针指针数组名数组名若有以下调用语句若有以下调用语句,则不正确的则不正确的fun函数的首部是函数的首部是A)voidfun(intm,intx)B)voidfun(ints,inth41)C)voidfun(intp,in
22、t*s)D)voidfun(intn,inta)main()inta50,n;fun(n,&a9);D四、多维数组的指针四、多维数组的指针二维数组二维数组staticinta34=1,3,5,7,9,11,13,15,17,19,21,23;理解为:理解为:有三个元素有三个元素a0、a1、a2,每一个元素代,每一个元素代表一行,每一个元素是一个包含表一行,每一个元素是一个包含4个元素的数组个元素的数组数组名数组名a代表:整个二维数组的首地址,代表:整个二维数组的首地址,也是元素也是元素a00的地址,同时代表第一的地址,同时代表第一行元素的首地址。行元素的首地址。a+1表示第二行元素的首地址,也
23、是元素表示第二行元素的首地址,也是元素a10的地址。的地址。a+2表示第三行元素的首地址,也是元素表示第三行元素的首地址,也是元素a20的地址。的地址。设数组的首地址是设数组的首地址是2000,则有,则有a等于等于2000。第第一一行行4个个元元素素,占占8字字节节,因因此此第第二二行行的的首首地址是地址是2008,即,即a+1等于等于2008。第第二二行行4个个元元素素,占占8字字节节,因因此此第第三三行行的的首首地址是地址是2016,即,即a+2等于等于2016。由于把由于把a0、a1、a2看成一维数组看成一维数组(一维数组名),它一维数组名),它们代表各自数组的首地址,即:们代表各自数组
24、的首地址,即:a0&a00等价于等价于*(a+0),a1&a10等价于等价于*(a+1)a2&a20等价于等价于*(a+2)根据一维数组的表示方法,有:根据一维数组的表示方法,有:a0+1:&a01一一维维数数组组中中第第二二个个元元素素的的地地址址a1+1:&a11;等等 价价 于于*(a+1)+1a0+2:&a02综上所述,二维数组综上所述,二维数组a的地址用下图说明的地址用下图说明已知某元素的指针后,可以用已知某元素的指针后,可以用*运算符运算符访问该元素。例、访问该元素。例、*(a1+2)=a12=13二维数组元素二维数组元素aij 的值可用以下方式表示:的值可用以下方式表示:*(a
25、i+j),*(*(a+i)+j),aij二维数组元素二维数组元素aij的地址可用以下方式表示:的地址可用以下方式表示:a i+j,*(a+i)+j,&aij详见:详见:P225补充练习:补充练习:若有以下定义和语句:若有以下定义和语句:ints45,(*ps)5;ps=s;则对则对s数组元素的正确引用形式是数组元素的正确引用形式是()A)ps+1B)*(ps+3)C)ps02D)*(ps+1)+3C例例10.11运行运行2、指向多维数组的指针变量、指向多维数组的指针变量(1)指向数组元素的指针变量。)指向数组元素的指针变量。(用列指针对二维数组进行操作)(用列指针对二维数组进行操作)例例10.
26、12用指针变量输出数组元素的值。用指针变量输出数组元素的值。main()staticinta34=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(%4d,*p);注意:本例用指针顺序访问二维数组的元素。若注意:本例用指针顺序访问二维数组的元素。若需访问二维数组需访问二维数组anm(n行行m列)的某个元素列)的某个元素aij,计算该元素的相对位置公式为:,计算该元素的相对位置公式为:i*m+j(i,j=0,1,2,.)这种方法相当于把二维数组转化为一维数组来使用。这种方法相
27、当于把二维数组转化为一维数组来使用。(2)指向指向m个元素组成的一维数组的指针变个元素组成的一维数组的指针变量量(用行指针对二维数组进行操作)(用行指针对二维数组进行操作)int(*p)4;例例10.13:输出二维数组任一行任一列元素的值。:输出二维数组任一行任一列元素的值。main()inta34=1,3,5,7,9,11,13,15,17,19,21,23;int(*p)4,i,j;p=a;scanf(“i=%d,j=%d”,&i,&j);printf(“a%d%d=%dn”,i,j,*(*(p+i)+j);说明:说明:(*p)4表示表示p为单独一个指针变量,行指针,指为单独一个指针变量,
28、行指针,指向含有向含有4个元素的一维数组,即个元素的一维数组,即*p有有4个元素,每个元个元素,每个元素为整型。素为整型。*p4为指针数组,为指针数组,*p数组有数组有4个元素,每个元素中个元素,每个元素中存放的是地址,即存放的是地址,即每个元素都为指针变量。每个元素都为指针变量。多维数组的指针作函数参数多维数组的指针作函数参数两种情况:两种情况:(1)用指向变量的指针变量用指向变量的指针变量(2)用指向一维数组的指针变量用指向一维数组的指针变量例例10.14运行运行例例10.15运行运行10.4字符串的指针字符串的指针一、字符串的表现形式一、字符串的表现形式C语言中,有两种方式可以实现字符串
29、:语言中,有两种方式可以实现字符串:字符数组字符数组字符指针字符指针字符数组字符数组例例10.16main()staticcharstring=IloveChina!;printf(%sn,string);string是数组名,代表字符数组的首地址。数组是数组名,代表字符数组的首地址。数组可以用下标访问,也可以用指针访问。例、可以用下标访问,也可以用指针访问。例、string4表示一个元素其值是字符表示一个元素其值是字符v,也可以用,也可以用*(string+4)来访问,来访问,string+4是指向字符是指向字符v的指的指针。针。字符指针字符指针例例10.17main()char*strin
30、g=IloveChina!;printf(%sn,string);string是一个指针变量,是一个指针变量,“IloveChina!是一是一个字符串常量。语句:个字符串常量。语句:char*string=IloveChina!;等价于等价于char*string;string=IloveChina!;它把字符串常量的首它把字符串常量的首地址地址赋给指针赋给指针string.不能理不能理解为把字符串常量赋值给指针变量。解为把字符串常量赋值给指针变量。*string=IloveChina!;从以上两个例子中,可以看到:从以上两个例子中,可以看到:1、字符数组和字符指针的概念不同。、字符数组和字符
31、指针的概念不同。2、字符指针指向字符串,而、字符指针指向字符串,而C语言中,字符串按语言中,字符串按数组方式处理,因此,字符数组和字符指针的数组方式处理,因此,字符数组和字符指针的访问方式相同。例如,均可以使用访问方式相同。例如,均可以使用%s格式控制格式控制符进行整体输入输出。但应注意,如果不是字符进行整体输入输出。但应注意,如果不是字符数组,而是整型、实型等数字型数组,不能符数组,而是整型、实型等数字型数组,不能用用%s,只能逐个元素处理。,只能逐个元素处理。例例10.18将将字字符符串串a复复制制到到字字符符串串b。main()chara=Iamaboy.;charb20;inti;fo
32、r(i=0;*(a+i)!=0;i+)*(b+i)=*(a+i);*(b+i)=0;printf(stringais:%sn,a);printf(stringbis:);for(i=0;bi!=0;i+)printf(%c,bi);printf(n);例例10.19将字符串将字符串a复制到字符串复制到字符串b。(用指针处理)。(用指针处理)main()chara=Iamaboy.,b20,*p1,*p2;inti;p1=a;p2=b;for(;*p1!=0;p1+,p2+)*p2=*p1;*p2=0;printf(stringais:%sn,a);printf(stringbis:);for(
33、i=0;bi!=0;i+)printf(%c,bi);printf(n);二、字符串指针作函数参数二、字符串指针作函数参数将一个字符串从一个函数传递到另一个将一个字符串从一个函数传递到另一个函数,可以使用传地址的方式,即用字函数,可以使用传地址的方式,即用字符数组名或字符指针变量作参数。有以符数组名或字符指针变量作参数。有以下四种情况:下四种情况:实参实参形参形参1数组名数组名数组名数组名2数组名数组名字符指针变量字符指针变量3字符指针变量字符指针变量字符指针变量字符指针变量4字符指针变量字符指针变量数组名数组名例例10.20用函数调用实现字符串的复制。用函数调用实现字符串的复制。(1)用字符
34、数组作参数。)用字符数组作参数。voidcopy_string(charfrom,charto)inti=0;while(fromi!=0)toi=fromi;i+;toi=0;main()chara=Iamateacher.;charb=youareastudent.;printf(string_a=%snstring_b=%sn,a,b);copy_string(a,b);printf(string_a=%snstring_b=%sn,a,b);main()函数可以改写为(使用字符指针):函数可以改写为(使用字符指针):main()char*a=Iamateacher.;char*b=yo
35、uareastudent.;printf(string_a=%snstring_b=%sn,a,b);copy_string(a,b);printf(string_a=%snstring_b=%sn,a,b);(2)形参用字符指针。)形参用字符指针。voidcopy_string(char*from,char*to)for(;*form!=0;from+,to+)*to=*from;*to=0;main()char*a=Iamateacher.;char*b=youareastudent.;printf(string_a=%snstring_b=%sn,a,b);copy_string(a,b
36、);printf(string_a=%sn string_b=%sn,a,b);(3)对对copy_string函函数数的的几几种种简简化化voidcopy_string(char*from,char*to)while(*to=*from)!=0)to+;from+voidcopy_string(char*from,char*to)while(*to+=*from+)!=0);当遇到当遇到*from=0时,不执行赋值运算时,不执行赋值运算*to+=*from+,因此,最后应加一句,因此,最后应加一句*to=0。voidcopy_string(char*from,char*to)while(*f
37、rom!=0)*to+=*from+;*to=0;与第与第种简化相同,当种简化相同,当*from=0时,时,表达式表达式*to+=*from+的值等于的值等于0(假)(假),结束,结束while循环。循环。voidcopy_string(char*from,char*to)while(*to+=*from+);for循环的结束条件是表达式循环的结束条件是表达式*to+=*from+的值(即的值(即*from的值)等于的值)等于0。且。且form中的中的0已被赋给已被赋给to。注意注意0的的ASCII码是不是码是不是0。voidcopy_string(char*from,char*to)for(
38、;(*to+=*from+)!=0;);或或for(;*to+=*from+;);形参用数组,使用局部指针变量指向形形参用数组,使用局部指针变量指向形参数组。参数组。voidcopy_string(charfrom,charto)char*p1,*p2;p1=from;p2=to;while(*p2+=*p1+)!=0)补充练习:补充练习:以下程序的输出结果是以下程序的输出结果是():#include#includemain()char b18=“abcdefg”,b28,*pb=b1+3;while(-pb=b1)strcpy(b2,pb);printf(“%dn”,strlen(b2);A
39、)8 B)3 C)1 D)7D字符数组和字符指针的比较字符数组和字符指针的比较字符数组字符数组组成组成由若干元素组成,每个元素中放一个字符。由若干元素组成,每个元素中放一个字符。赋初值方式赋初值方式staticcharstr=IloveChina!;赋值方式赋值方式charstr14;str=IloveChina!占占用用内内存存字字符符数数组组一一个个元元素素占占一一字字节节内内存存,且且在在编编译时分配。译时分配。charstr10;scanf(%s,str);字符指针字符指针组成组成2或或4字节,存放字符串的字节,存放字符串的首地首地址。址。赋初值方式赋初值方式char*a=IloveC
40、hina!;赋值方式赋值方式char*a;a=IloveChina!;占占用用内内存存指指针针变变量量中中只只可可以以放放一一个个地地址址值值(近近指指针针=2字字节节,远远指指针针=4字字节节)。且且编编译译时时未未指定。指定。char*a;scanf(“%s”,a);a尚未指向任何变量尚未指向任何变量#includemain()charstrg40,*there,one,two;int*pt,list100,index;strcpy(strg,”thisisacharacterstring”);one=strg0;two=*str;printf(“第一输出的是第一输出的是%c%cn”,on
41、e,two);one=str8;two=*(str+8);printf(“第二输出的是第二输出的是%c%c”,one,two);there=strg+10;printf(“第三输出的是第三输出的是%cn”,strg10);printf(“第四输出的是第四输出的是%cn”,*there);for(inde=0;index10;index+)listindex=index+100;pt=list+27;printf(“第五输出的是第五输出的是%d%d”,list27,*pt);T Ta acc127 127补充练习:补充练习:1、若有如下图所示五个连续的若有如下图所示五个连续的int类型的存储单类
42、型的存储单元并赋值如下图元并赋值如下图,a0的地址小于的地址小于a4的地址。的地址。p和和s是基类型为是基类型为int的指针变量。请对以下问的指针变量。请对以下问题进行填空。题进行填空。a0a1a2a3a4223344 55 66(1)若若p已已指指向向存存储储单单元元a1。通通过过指指针针p,给给s赋值赋值,使使s指向最后一个存储单元指向最后一个存储单元a4的语句是的语句是。(2)若若指指针针s指指向向存存储储单单元元a2,p指指向向存存储储单单元元a0,表达式表达式s-p的值是的值是_。*s=*(p+3)22、下面函数用来求出两个整数之和、下面函数用来求出两个整数之和,并通并通过形参传回两
43、数相加之和值过形参传回两数相加之和值,请填空。请填空。int add(int x,int y,_z)_=x+y;int*z3、以下程序的功能是、以下程序的功能是:将无符号八进制数字构成将无符号八进制数字构成的字符串转换为十进制整数。例如的字符串转换为十进制整数。例如,输入的字符输入的字符串为串为:556,则输出十进制整数则输出十进制整数366。请填空。请填空。main()char*p,s6;int n;p=s;gets(p);n=*p-0;while(_!=0)n=n*8+*p-0;printf(%d n,n);*(+p)4、函数、函数 void fun(float*sn,int n)的功能是
44、的功能是:根据以下公根据以下公式计算式计算S,计算结果计算结果 通过形参指针通过形参指针sn传回传回;n通过形参传入通过形参传入,n的值大于等于的值大于等于0。请填空。请填空。1 1 1 1 S=1-+-+3 5 7 2n+1 void fun(float*sn,int n)float s=0.0,w,f=-1.0;int i=0;for(i=0;i=n;i+)f=_*f;w=f/(2*i+1);s+=w;_=s;-1*sn5、以下程序的输出结果是、以下程序的输出结果是_main()intx=0;sub(&x,8,1);printf(“%dn”,x);sub(int*a,intn,intk)i
45、f(k=n)sub(a,n/2,2*k);*a+=k;7程序运行演示:程序运行演示:*a=0,n=8,k=1sub(int*a,intn,intk)if(k=n)sub(a,n/2,2*k);*a+=k;*a=0,n=4,k=2sub(int*a,intn,intk)if(k=n)sub(a,n/2,2*k);*a+=k;*a=0,n=2,k=4sub(int*a,intn,intk)if(k=n)sub(a,n/2,2*k);*a+=k;*a=*a+k*a=0+4=4*a=*a+k*a=4+2=6*a=*a+k*a=6+1=76、以下程序中函数、以下程序中函数sort的功能是对的功能是对a所
46、指数组所指数组中的数据进行由大到小的排序,程序运行后的输中的数据进行由大到小的排序,程序运行后的输出结果是(出结果是()void sort(int a,int n)int i,j,t;for(i=0;in-1;i+)for(j=i+1;jn;j+)if(aiaj)t=ai;ai=aj;aj=t;main()int aa10=1,2,3,4,5,6,7,8,9,10,i;sort(&aa3,5);for(i=0;i10;i+)printf(%d,aai);printf(n);1,2,3,8,7,6,5,4,9,107、若有说明,、若有说明,int n=2,8p=&n,*q=p;则则以下非法的赋值
47、语句是:以下非法的赋值语句是:A)p=q;B)*p=*q;C)n=*q;D)p=n;D8、有以下程序,程序运行后的输出结、有以下程序,程序运行后的输出结果是(果是()voidfun(char*c,intd)*c=*c+1;d=d+1;printf(%c,%c,*c,d);main()chara=A,b=a;fun(&b,a);printf(%c,%cn,a,b);b,B A,b9、以以下下程程序序中中函函数数reverse的的功功能能是是将将a所所指指数数组组中中的的内容进行逆置。程序运行后的输出结果是(内容进行逆置。程序运行后的输出结果是()void reverse(int a,int n)int i,t;for(i=0;in/2;i+)t=ai;ai=an-1-i;an-1-i=t;main()int b10=1,2,3,4,5,6,7,8,9,10;int i,s=0;reverse(b,8);for(i=6;i10;i+)s+=bi;printf(%dn,s);2210、若有以下定义和语句:、若有以下定义和语句:ints,(*ps)5;ps=s;则对则对s数组元素的正确引用形式是数组元素的正确引用形式是()A)ps+1B)*(ps+1)C)ps02D)*(ps+1)+3C