版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指针及其应用第8章指针及其应用学习目标掌握指针得概念及基本操作,指针在数组与函数中得应用。学习内容指针、指针变量得概念,指针变量定义及使用,指针与一维数组,指针与二维数组,指针与字符串,指针与函数。下一页返回第8章指针及其应用8、1指针得基本用法8、2指针与数组8、3指针与函数8、4指针应用实例8、5本章小结8、6实训上一页返回8、1指针得基本用法8、1、1指针得概念计算机得内存就是以字节为单位得一片连续得存储空间,每个字节都有一个编号,这个编号称为内存单元地址。这就如同旅馆得每个房间都有一个房间号一样,如果没有房间号,旅馆得工作人员就无法进行管理,同样没有字节编号,系统就无法对内存单元进行管理。若在程序中定义了一个变量,系统就会根据变量得类型为变量在内存中分配若干字节得存储空间,此后这个变量得单元地址也就确定了。有了变量得地址,就可以立即找到该变量所在得存储单元并进行数据得存取操作。这种通过变量地址存取变量值得方式称为变量得直接访问。程序中通常就是通过变量名对变量进行访问,因为变量名就是变量得符号地址,它与单元物理地址之间得联系由系统自动建立。提示:注意区分变量得地址与变量得值这两个概念。下一页返回8、1指针得基本用法存储单元地址惟一地对应着(或指向)存储单元,因此C语言将存储单元地址形象地称为"指针"。前面学习得变量,都就是用来存放基本类型数据得,如存放整数或实数等,这些变量称为简单变量。在C语言中,还可以定义一种特殊得变量,这种变量专门用来存放另一个变量得地址(即指针),称为指针变量。如果p就是指针变量,而且p中存放着变量a得地址,则称p指向a,常用图8-1所示得形式表示。那么可以通过指针变量p引用它所指向得变量a,这种变量访问方式称为变量得间接访问。本章主要介绍得内容就就是变量得间接访问。下一页返回上一页8、1指针得基本用法8、1、2指针变量得定义与使用1、指针变量得定义任何变量在使用前都必须定义,指针变量也一样。指针变量得一般定义形式为:基类型名*指针变量名;例如:int*p1,*p2;说明:(1)定义了两个指针变量,变量名为p1与p2,这两个变量只能用来存放地址。(2)*就是一个说明符用来说明定义得就是指针变量,定义指针变量时必须有。(3)基类型表示指针变量所指向得变量得类型,也就就是说,p1、p2中只能存放整型变量得地址。下一页返回上一页8、1指针得基本用法2、指针变量得使用(1)运算符“&”与“*”运算符“&”为取地址运算符,后跟一个变量,表示取变量得地址。比如,&a表示变量a得地址。运算符“*”为间接访问运算符,后跟一个指针变量,表示取这个指针变量所指向得变量得值。(2)指针变量得赋值通过给指针变量赋地址值,可以让指针变量指向某个变量。例如有以下定义与语句:inta,b,*pa,*pb;pa=&a;/*指针变量pa指向变量a*/pb=&b;/*指针变量pb指向变量b*/下一页返回上一页8、1指针得基本用法下面得定义与语句就是错误得:floatx;int*p;p=&x;错误原因就是x得类型与p得基类型不一致。(3)通过指针变量引用变量例如,有以下定义与语句:inti,j,*p;p=&i;*p=10;/*将10赋给p所指向得变量即变量i,等价于赋值语句i=10;*/下一页返回上一页8、1指针得基本用法j=*p+1;/*取指针变量p所指向得存储单元中得值加1后赋给变量j,j得值为11*/*p=*p+1;/*取指针变量p所指向得存储单元中得值,加1后再放入p所指向得存储单元中,也就就是使变量i得值增1变为11*/小测验inta=11,b=22,*pa,*pb;pa=&a;pb=&b;在上面程序段得基础上,执行语句pa=pb;与执行语句*pa=*pb;有什么不同?下一页返回上一页8、1指针得基本用法【例8-1】通过指针变量访问整型变量。【程序代码】#include<stdio、h>voidmain(){ inti,j,*pi;/*定义整型变量i与j,指针变量pi*/ i=10; pi=&i;/*使指针变量p指向变量i*/ j=*pi+5;/*通过指针变量访问变量i,等价于j=i+5;*/ printf("%d\n",i); printf("%d,%d\n",*pi,j);}下一页返回上一页8、1指针得基本用法程序运行结果:【例8-2】从键盘上输入任意三个实数,利用指针得方法将这三个实数按大小进行排序。【编程思路】(1)输入3个实数分别放到变量a、b、c中。(2)3个指针变量p1、p2、p3分别指向变量a、b、c。(3)比较变量得值,最终使p1指向最大值,p3指向最小值。(4)按顺序输出p1、p2、p3所指向得变量得值。下一页返回上一页12大家应该也有点累了,稍作休息大家有疑问的,可以询问和交流8、1指针得基本用法【程序代码】#include<stdio、h>voidmain(){ floata,b,c,*p1,*p2,*p3,*p;printf("请输入3个实数:"); scanf("%f,%f,%f",&a,&b,&c); p1=&a; p2=&b; p3=&c; if(a<b) {p=p1;p1=p2;p2=p;} if(a<c)
下一页返回上一页上一页8、1指针得基本用法{p=p1;p1=p3;p3=p;} if(b<c) {p=p2;p2=p3;p3=p;} printf("%、2f,%、2f,%、2f\n",*p1,*p2,*p3);}程序运行结果:该程序执行过程中,变量a、b、c得值始终未变,只就是使指针p1最终指向值最大得变量,使指针p3最终指向值最小得变量。返回8、2指针与数组8、2、1指针与一维数组1、指针得移动当指针变量指向一串连续得存储单元(即数组)时,可以对指针变量加上或减去一个整数来进行指针得移动与定位。例如有如下语句:inta[5]={10,20,30,40,50},*p,*q;p=&a[0];指针p得指向情况如图8-2(a)所示。在此基础上,随着下面各个语句得执行,指针p与q得指向会发生相应变化。q=p+1;如图8-2(a)所示,使指针变量q指向数组元素a[1]q++;指针后移,指针变量q指向数组元素a[2]q+=2;指针变量q指向数组元素a[4]下一页返回8、2指针与数组q--;指针变量q指向数组元素a[3]p++;指针变量p与q得指向如图8-2(b)所示现在如果有语句i=*p;j=*q;则i中得值为20,j中得值为40。若有语句k=q-p;则k中得值为2。表达式p<q得值为真,因为当前指针变量p中存得地址值小于指针变量q中存得地址值。2、数组元素得地址C程序中,数组名就是数组得首地址,即第1个数组元素得地址,该地址就是地址常量,因此不能被修改或重新赋值,例如,对数组名a来说,a++;或a=&a[2];都就是错误得使用方法。虽然不能对数组名进行赋值,但可以通过数组名来表示数组元素得地址,从而也能达到引用数组元素得目得。例如:inta[10],*p;p=a;此时指针p指向数组a得第1个元素,如图8-3所示。数组元素地址得几种表示形式见表8-1。下一页返回上一页8、2指针与数组3、数组元素得引用针对数组元素地址得不同表示形式,数组元素得引用形式也有多种,见表8-2。下面语句通过数组名逐个输出数组a中各元素得值:for(i=0;i<10;i++)printf("%5d",*(a+i));这里首地址a始终指向数组元素a[0],并没有移动,通过变量i值得变化来引用到每个元素。下面语句通过移动指针来逐个输出数组a中各元素得值:for(p=a;p<a+10;p++)printf("%5d",*p);下一页返回上一页8、2指针与数组此语句在执行过程中,指针p首先指向元素a[0],输出操作输出得就是第一个元素得值,执行了p++后,指针指向了元素a[1],此时再做输出操作,输出得就是第二个元素得值,依次下去,指针会逐个指向每个元素,再输出它们得值。当指针p指向最后一个元素后面得存储单元时,循环结束。【例8-3】有一个数组score,存放10个学生得成绩,求平均成绩,要求通过指针变量来访问数组元素。【程序代码】#include<stdio、h>voidmain(){下一页返回上一页8、2指针与数组floatscore[10],*p,sum=0,ave; printf("请输入10个学生成绩:"); for(p=score;p<score+10;p++) scanf("%f",p); for(p=score;p<score+10;p++) sum+=*p;/*取各成绩累加到sum中*/ ave=sum/10;/*求平均成绩*/ printf("平均成绩=%、2f\n",ave);}程序运行结果:下一页返回上一页8、2指针与数组【例8-4】使数组中得元素逆序存放(不借助其它数组),要求用指针得方法处理。【编程思路】(1)定义两个指针变量p1、p2,使p1指向第一个元素、p2指向最后一个元素。(2)将p1、p2所指向得数组元素得值互换,然后使p1指向第二个元素、p2指向倒数第二个元素,再做上面得互换操作,这样重复下去,直到p1指向了p2得后面或p1与p2指向了同一元素为止。【程序代码】#include<stdio、h>voidmain(){
下一页返回上一页8、2指针与数组inta[10],*p1,*p2,temp; printf("请输入10个数:");
for(p1=a;p1<a+10;p1++)/*输入一个整数,存放在p1所指得存储单元中*/ scanf("%d",p1); for(p1=a,p2=a+9;p1<p2;p1++,p2--)/*通过交换首尾对应位置上得值实现逆置*/ { temp=*p1;*p1=*p2;*p2=temp;/*两个指针变量所指向得元素得值互换*/ } printf("逆序后数组得值:"); for(p1=a;p1<a+10;p1++)下一页返回上一页8、2指针与数组 printf("%5d",*p1);printf("\n");}程序运行结果为:下一页返回上一页8、2指针与数组8、2、2指针与二维数组1、二维数组元素得地址例如:inta[3][3];与一维数组名一样,二维数组名a也就是数组得首地址。但就是二者不同得就是,二维数组名得基类型不就是数组元素类型,而就是一维数组类型,因此二维数组名a就是一个行指针,其指向如图8-4所示。二维数组a包含三个行元素:a[0]、a[1]与a[2],而它们又都就是一维数组名,因此也就是地址常量,但就是它们得基类型与数组元素类型一致。第0行首地址:a[0]第1行首地址:a[1]第2行首地址:a[2]下一页返回上一页8、2指针与数组所以a[0]+1就就是数组元素a[0][1]得地址,a[1]+1就是数组元素a[1][1]得地址,那么任意得数组元素a[i][j]得地址就是a[i]+j。二维数组元素得地址表示形式较多,每种地址形式都有对应得数组元素引用方法。比如:数组元素地址:①&a[i][j]②a[i]+j③*(a+i)+j数组元素引用:①a[i][j]②*(a[i]+j)③*(*(a+i)+j)2、指向二维数组元素得指针变量(列指针)例如:inta[3][2],*p;p=&a[0][0];二维数组在内存中就是按行顺序存储得,因此,可以通过对指向数组元素得指针变量进行加减运算来达到引用任意数组元素得目得,引用方法与引用一维数组元素一样。下一页返回上一页8、2指针与数组【例8-5】用指向数组元素得指针访问数组。【程序代码】#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++)/*最后一个元素得地址就是a[0]+8*/ { if((p-a[0])%3==0)printf("\n");/*换行控制*/ printf("%5d",*p);下一页返回上一页8、2指针与数组
}printf("\n");}程序运行结果:a[0]就是数组得第一个元素得地址,且基类型与指针p得基类型一致都就是int型,所以用p=a[0]使指针p指向数组得第一个元素,这个表达式还可用p=&a[0][0]代替,同样a[0]+8也等价于&a[0][0]+8。下一页返回上一页8、2指针与数组3、指向二维数组得行指针变量(行指针)行指针变量就就是用来存放"行"地址得变量,一般定义形式为:数据类型名(*指针变量名)[数组长度];例如:int(*p)[4];p就是一个指针变量,它得基类型就是一个包含4个整型元素得一维数组,因此指针变量p可以指向一个有4个元素得一维数组。【例8-6】利用行指针输出二维数组元素得值。【程序代码】#include<stdio、h>voidmain(){ inta[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int(*p)[3],j;/*指针变量p为行指针*/
下一页返回上一页8、2指针与数组for(p=a;p<a+3;p++) { for(j=0;j<3;j++) printf("%5d",*(*p+j)); printf("\n"); }}程序运行结果为:在此把数组a瞧成就是一维数组,它得元素有a[0]、a[1]、a[2]。由于指针p与数组名a表示得地址常量得基类型相同,所以可以用p=a,它使指针p指向了数组a得第一个元素a[0],这时*p表示就是a[0]得值,即为第0行得首地址,如有*p+1,它表示a[0][1]得地址,*(*p+1)表示数组元素a[0][1]。p++执行一次,指针p向后移动一行下一页返回上一页8、2指针与数组4、指针数组比如有如下定义:inta[3][4],*p[3];数组p就是一个包含3个元素得一维数组,它得每个元素都就是基类型为int得指针,所以称数组p为指针数组。p[i]与a[i](0≤i≤3)得基类型相同(都为int类型),因此赋值语句p[i]=a[i];就是合法得。比如有以下循环语句:for(i=0;i<3;i++) p[i]=a[i]; 该语句执行完后,数组p得3个元素p[0]、p[1]与p[2]分别指向数组a每行得开头,如图8-5所示。此时如果有语句printf("%d,%d",*p[0],*(p[0]+1));,那么输出得就是数组元素a[0][0]与a[0][1]得值。下一页返回上一页8、2指针与数组8、2、3指针与字符串字符数组通常用来存放字符串,指针指向字符数组也就指向了字符串,因此通过指针可以引用它所指向得字符串。【例8-7】通过指针引用字符串。【程序代码】#include<stdio、h>voidmain(){ charstr[]="BeiJing",*p; p=str;/*指针p指针字符串首部*/ printf("%s\n",p);/*从字符串首字符开始输出,遇‘\0’结束*/
下一页返回上一页8、2指针与数组p+=3;/*移动指针p*/ printf("%s\n",p);/*从指针p所指字符开始输出,遇‘\0’结束*/}程序运行结果为:指针先指向字符串首部,从此位置开始输出,遇到结束符‘\0’为止,然后指针向后移动了3个字符,从串中第4个字符开始输出,遇结束符‘\0’为止。【例8-8】利用指针实现两个字符串得连接。【编程思路】(1)指针p指向第一个串得末尾(最后一个字符后面),指针q指向第二个串得首部。(2)将第二个串中字符依次放入第一个串后。下一页返回上一页8、2指针与数组【程序代码】#include<stdio、h>#include<string、h>voidmain(){ charstr1[20],str2[10],*p,*q; printf("请输入两个字符串:"); gets(str1); gets(str2); p=str1+strlen(str1);/*p指向第一个串得末尾*/ q=str2;/*q指向第二个串得首部*/
下一页返回上一页8、2指针与数组while(*q!='\0')/*如果第二个串未结束,继续执行*/ { *p=*q; p++;/*指针p向后移动*/ q++;/*指针q向后移动*/ } *p='\0';/*串末尾加上结束标志*/printf("连接后新串为:"); puts(str1);}程序运行结果为:返回上一页8、3指针与函数8、3、1变量地址作函数参数调用函数时,通过函数得参数不仅能够传递普通得值,而且还能传递地址值。当实参为一个地址时,形参必须就是一个基类型与它相同得指针变量。【例8-9】求两数之与。【程序代码】#include<stdio、h>intadd(int*x,int*y)/*形参为指针变量*/{ intz; z=*x+*y; returnz;返回下一页8、3指针与函数}voidmain(){ inta,b,sum; printf("请输入2个整数:"); scanf("%d%d",&a,&b); sum=add(&a,&b);/*实参为变量得地址(即指针)*/ printf("%d+%d=%d\n",a,b,sum);}程序运行结果:下一页返回上一页8、3指针与函数程序分析:调用add()函数时,实参就是变量a、b得地址,形参就是两个指针变量,只有指针变量才能接收地址值。接收完毕后,形参指针x指向了变量a,形参指针y指向了变量b,实参变量与形参指针间得关系如图8-6所示。这样就可以在函数中通过指针变量访问实参变量单元。
此例中通过传送地址,使形参指针指向了实参变量,这样使得在被调函数中通过形参来改变实参得值成为可能。同时,原来只能通过return语句返回一个函数值,利用传地址得形式,可以把两个或两个以上得值从被调函数中返回到调用函数。【例8-10】调用swap函数,交换主函数中变量x与y中得数据。【程序代码】#include<stdio、h>
下一页返回上一页8、3指针与函数voids*a,int*b){ intt; t=*a;*a=*b;*b=t;}voidmain(){ intx,y; printf("请输入2个整数:"); scanf("%d%d",&x,&y); printf("(1)x=%d,y=%d\n",x,y); s); printf("(2)x=%d,y=%d\n",x,y);}下一页返回上一页8、3指针与函数程序运行结果:小测验如果将函数改为如下形式,程序还能实现变量x与y互换吗?voids*a,int*b){ int*t; t=a;a=b;b=t;}下一页返回上一页8、3指针与函数8、3、2数组名作函数参数数组名可以用作函数得形参与实参,例如下面程序片段:用数组名作实参时,就是把数组得首地址传送给形参数组,对应得形参数组接收传过来得就是实参数组得首地址,这样形参数组与实参数组共占同一段内存区域。数组元素a[0]与b[0]共占一个存储单元,a[1]与b[1]共占一个存储单元,、、、。引用形参数组元素得值也就就是引用实参数组元素得值,因此形参数组会影响实参数组。下一页返回上一页voidmain(){inta[5];
、、、、
f(a,5);
、、、、}voidf(intb[5],intn){
、、、、}8、3指针与函数【例8-11】数组名作函数参数。【程序代码】#include<stdio、h>voidadd(inta[],intb[])/*函数定义*/{ inti; for(i=0;i<3;i++) a[i]=a[i]+b[i];}voidmain(){ intx[3]={1,2,3};下一页返回上一页8、3指针与函数 inty[3]={4,5,6}; inti; add(x,y);/*函数调用,实参为数组名*/
for(i=0;i<3;i++) printf("%4d",x[i]);}小测验写出上面程序得输出结果。以上将实参数组与形参数组瞧成就是共用存储空间,这样比较形象,读者容易理解。实际上能够接收并存放地址值得只能就是指针变量,C编译系统就是将形参数组名处理成指针变量。下一页返回上一页8、3指针与函数假设某函数首部为:intadd(inta[],intb[])在编译时系统会处理为:intfun(int*a,int*b)调用函数时,指针变量接收从主调函数传递过来得实参数组首地址,这样形参指针指向了实参数组,那么可以通过形参指针去访问实参数组元素。提示:形参数组如果就是一维数组,定义时大小可以不指定;如果就是二维数组,第一维得大小可以不指定。【例8-12】在数组中第k个数前插入一个数x。【编程思路】(1)函数需要4个形参,分别接收:实参数组地址、实参数组大小、k、x。下一页返回上一页8、3指针与函数(2)函数中得操作:①指针指向最后一个元素。②从最后一个元素一直到下标为k-1得元素,依次往后移。③将x赋给下标为k-1得元素。【程序代码】#include<stdio、h>voidfun(int*b,intn,intk,intx){ inti; for(i=n-1;i>=k-1;i--)/*从最后一个元素到第k个元素,依次往后移*/ *(b+i+1)=*(b+i);下一页返回上一页8、3指针与函数 *(b+k-1)=x;/*将x插入*/}voidmain(){ inta[9]={1,2,3,4,5,6,7,8},k,x,i; printf("数组原值:"); for(i=0;i<8;i++) printf("%6d",a[i]); printf("\n请输入在第几位插入:"); scanf("%d",&k); printf("请输入插入得数据:"); scanf("%d",&x);
下一页返回上一页8、3指针与函数fun(a,8,k,x);/*函数调用*/ printf("插入%d后数组值:",x); for(i=0;i<9;i++) printf("%6d",a[i]); printf("\n");}程序运行结果为:下一页返回上一页上一页8、3指针与函数因为指针引用数组元素时,可以写成下标形式,因此程序中得语句:for(i=n-1;i>=k-1;i--) *(b+i+1)=*(b+i);*(b+k-1)=x;可以改写成下面语句形式,这样更清晰、简练。for(i=n-1;i>=k-1;i--) b[i+1]=b[i];b[k-1]=x;返回8、4指针应用实例【例8-14】利用指针实现把数组中得奇数存入另一数组中。【编程思路】(1)用两个指针p与q分别指向数组a与b。(2)利用指针移动逐个取出数组a中得每个元素,如果当前元素得值为奇数,则存入数组b中。【程序代码】#include<stdio、h>voidmain(){ inta[8],b[8],*p,*q,i; printf("请给a数组中输入8个整数:"); for(i=0;i<8;i++)
下一页返回8、4指针应用实例 scanf("%d",&a[i]); q=b;/*指针q指向数组b*/ for(p=a;p<a+8;p++) if(*p%2!=0) { *q=*p;/*如果p所指向得就是奇数,则存入b数组中*/ q++;/*指针q指向b数组中下一个元素*/ } printf("b数组中得值为:"); for(i=0;i<q-b;i++)/*q当前指向b数组中最后一个数值得后面,q-b为b数组所存数值得个数*/ printf("%d\t",b[i]);下一页返回上一页8、4指针应用实例 printf("\n");}程序运行结果:b数组虽然有8个元素,但只有前4个元素中有确切得值。【例8-15】先将在字符串s中得字符按正序存放到t串中,然后把s中得字符按逆序连接到t串得后面。例如:当s中得字符串为:"ABCDE"时,则t中得字符串应为:"ABCDEEDCBA"。下一页返回上一页8、4指针应用实例【编程思路】通过指针先由前往后访问s串,并逐个字符存入t串中;再由后往前访问s串,并逐个字符存入t串中,最后输出t串即可。#include<stdio、h>#include<string、h>voidmain(){ chars[20],t[20],*p,*q; printf("请输入一个字符串:"); gets(s); for(p=s,q=t;*p!='\0';p++,q++)/*正序存放*/ *q=*p; for(p--;p>=s;p--,q++)/*p由后向前访问s串,实现逆序连接*/
下一页返回上一页8、4指针应用实例 *q=*p; *q='\0'; puts(t);}程序运行结果:【例8-16】编写函数,其功能就是对传送过来得两个浮点数求出与值与差值,并通过形参传送回调用函数。【编程思路】(1)定义变量a、b存放两个浮点数,变量sum、sub存放两数得与与差。下一页返回上一页8、4指针应用实例(2)被调函数fun中,需要两个float类型得形参x、y来接收两个实数,还需要两个指针s、n,一个指向sum,一个指向sub。(3)函数fun中,计算得两数与放到s所指向得变量sum,两数差放到n所指向得变量sub中。【程序代码】#include<stdio、h>voidfun(floatx,floaty,float*s,float*n){ *s=x+y;/*将与放入s所指向得存储单元*/ *n=x-y;/*将差放入n所指向得存储单元*/}voidmain()下一页返回上一页8、4指针应用实例{ floata,b,sum,sub; a=10、5;b=20、8; fun(a,b,&sum,&sub); printf("%、2f+%、2f=%、2f\n",a,b,sum); printf("%、2f-%、2f=%、2f\n",a,b,sub);}程序运行结果:下一页返回上一页8、4指针应用实例【例8-17】将字符串从第k个字符起,删去m个字符,组成新字符串。【编程思路】(1)函数需要3个形参,分别接收串得首地址、k值与m值。(2)函数中得操作:①指针p指向第k个字符,指针q指向第k+m个字符。②赋值*p=*q。③指针p、q同时向后移,返回(2),直到q指向串结束标志。【程序代码】#include<stdio、h>voiddel(char*s,intk,intm){ char*p,*q;
下一页返回上一页8、4指针应用实例p=s+k-1;/*p指向第k个字符*/ q=s+k+m-1;/*指针q指向第k+m个字符*/ while(*q!='\0') *p++=*q++;/*赋值并且移动指针*/ *p='\0';}voidmain(){ charstr[30]; intk,m; printf("请输入字符串:"); gets(str);
下一页返回上一页上一页8、4指针应用实例printf("请输入从第几个字符开始删除:"); scanf("%d",&k); printf("请输入删除几个字符:"); scanf("%d",&m); del(str,k,m); printf("删除后字符串:"); puts(str);}程序运行结果:返回8、5本章小结1、每个变量都有地址(即指针),指针变量用于存放其她变量得地址。2、指针变量与普通变量一样,要先定义后使用。如有定义语句float*fp;,则fp只能指向float类型得变量。3、建立指针得指向关系,可以通过以下语句完成:(1)指针变量=&变量;(2)指针变量1=指针变量2;,其中指针变量2为已有指向得指针变量。4、变量得访问。变量可以通过变量名直接访问,也可以利用指针间接访问,"*指针变量"表示指针变量所指向得变量。5、指针与一维数组。当指针变量p指向数组时,可以通过p得自增与自减在数组区域内移动指针,方便地访问数组得各个元素。下一页返回上一页8、5本章小结6、指针与二维数组。二维数组得指针比较复杂,根据定义得指针类型,可分为列指针与行指针。列指针为数组元素地址,可以在数组元素间移动,行指针为各行首地址,只能在行间移动。二维数组名就是行指针常量。7、指针与函数。用指针作函数参数时,可以在被调函数中访问调用函数中得变量,为问题得处理提供了方便。函数间参数传递方式见表8-3。运用指针编程就是C语言主要风格之一。利用指针能方便地处理数组与字符串。不可否认指针也就是C语言学习中最难理解与使用得部分,学习中除了要正确理解指针得基本概念外,还需要多编写程序,多上机调试。返回8、6实训
实训1【实训内容】指针与指针变量。【实训目得】掌握指针与指针变量得使用。【实训题目】编写程序,实现以下得每一步操作,并写出输出结果,然后上机验证。(1)定义整型变量x,并赋初值4321。(2)定义指向整型变量得指针变量p与q,并使p指向变量x。(3)通过指针变量p使q指向变量x。(4)通过p对x中得值增加111。(5)通过q求x中得值得个位数,并把结果存放在p所指向得存储单元中。(6)通过x输出该变量中得值。下一页返回8、6实训
实训2
【实训内容】指针作为函数参数。【实训目得】掌握函数间得地址传递。【实训题目】分析下列程序,写出输出结果,然后上机进行验证。#include<stdio、h>voidfun(intx,inty,int*cp,int*dp){ *cp=x+y; *dp=x-y;}下一页返回上一页8、6实训voidmain(){ inta,b,c,d; a=4; b=3; fun(a,b,&c,&d); printf("%d,%d\n",c,d);}下一页返回上一页8、6实训
实训3【实训内容】数组名作为函数参数。【实训目得】掌握数组作为函数参数得使用。【实训题目】编写程序,交换数组a与数组b中得对应元素,要求数组交换
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业资产管理系统维护与更新工具
- 外贸进出口流程合规操作及风险防范手册
- 供应链管理标准操作流程手册
- 智慧城市安全稳定运行承诺书7篇范文
- 2026年健康管理师服务模式与案例解析
- 2026年老年健康手册编制与发放案例
- 2021-2022学年浙江省宁波市镇海区蛟川书院七年级(上)期中数学试卷-带答案详解
- 河池电缆桥架安装协议书
- 走向高考·二轮数学专题1-第3讲
- 拆迁安置协议书大修基金
- 武汉大学分析化学教案第3章分析化学的误差与数据处理课件
- MT 425-1995隔绝式化学氧自救器
- 2023年辽宁大连中远海运川崎船舶工程有限公司招聘笔试题库及答案解析
- GB/T 18046-2008用于水泥和混凝土中的粒化高炉矿渣粉
- 临床检验基础各章节练习题及思考题
- 托幼机构卫生保健人员测试卷附答案
- 公司软件开发技术能力说明
- 钢结构工程计量课件
- 一例慢阻肺病人护理个案
- 教师口语教程教学课件汇总全套电子教案(完整版)
- 中国文化概论课件04
评论
0/150
提交评论