C语言全国计算机二级等级考试教程d第八章地址和指针章节带习题PPT课件下载推荐.ppt
《C语言全国计算机二级等级考试教程d第八章地址和指针章节带习题PPT课件下载推荐.ppt》由会员分享,可在线阅读,更多相关《C语言全国计算机二级等级考试教程d第八章地址和指针章节带习题PPT课件下载推荐.ppt(19页珍藏版)》请在冰豆网上搜索。
,31012,当访问变量时,为“直接存取(直接访问)”。
我们也可以通过指针变量间接的访问该地址中原来的值。
此时称为“间接存取(间接访问)”。
8.2指针变量的定义和指针变量的基类型,定义指针变量的一般形式如下:
类型名*指针变量名;
或类型名*指针变量名1,*指针变量名2,;
例如:
int*pi;
int*pj,*pa;
1.pi,pj,pa都是变量,不过都是指针变量,定义时在普通变量名的左边加上星号就行了。
说明:
pi,pj,pa三个指针变量的类型为整型,说明三个变量中只能存放int类型变量的地址。
这时我们称int是指针变量pi,pj,pa的基类型。
如:
double*pd;
char*s1,*s2;
pd的基类型为double类型,在指针变量pd中,只能存放double类型变量的地址。
s1和s2的基类型为char类型,在指针变量s1和s2中,只能存放char类型变量的地址。
8.3给指针变量赋值,8.3.1给指针变量赋地址值,例如:
intk,*q,*p;
/*k为整型变量,q和p都是指针变量。
*/,q,p,k,k=1;
/*给普通变量赋值*/,整型变量k只被能赋予整型值,赋值时直接赋值就可以了,而指针变量只能被赋予地址值,如下是把整型变量k的地址赋值给指针变量q。
q=,&
是用来求出变量的地址。
1,&
k,知识点:
由于把变量k的地址赋予了指针变量q,q中现在存放的就是变量k的地址,这时可以说:
q指向了变量k。
指针变量之间也可以进行赋值:
p=q;
&
k,当我们输出变量k,q,p时,输出的结果为;
112450521245052,8.3给指针变量赋值,8.3.2给指针变量赋“空”值,除了给指针变量赋地址值之外,还可以给指针变量赋一个特殊的值,该值为“空”值。
int*p;
p=NULL;
p=0;
注意,此时,指针变量p中不是没有值,而是有一个“空”值。
8.4对指针变量的操作,8.4.1通过指针来引用一个存储单元,#includemain()intk,*q,*p;
k=1;
q=,112450521245052,输出时,变量k为1,而指针变量q和p则为变量k的地址。
#includemain()intk,*q,*p;
q=,1,k,&
k,q,&
k,p,111,访问时,在指针变量前在*(间接访问运算符)则表示访问该地址中原来的值。
8.4对指针变量的操作,8.4.1通过指针来引用一个存储单元,假定有以下定义和语句:
int*p,i=10,j;
p=,/*定义了三个变量*/*取变量i的地址赋给指针变量p*/*间接访问指针变量中的值10赋给变量j*/,p,10,i,j,10,j=i;
间接访问运算符*是一个单目运算符,必须出现在运算对象的左边。
其运算对象可以是存放地址的指针变量,也可以是地址。
j=*(,j=*,扩展知识:
j=*p+1;
10,j,11,j,int*p,k=0;
p=,p,k,*p=100;
100,0,k=100;
*p=*p+1;
k=k+1;
101,*p+=1;
或+*p;
或(*p)+;
k+=1;
或+k;
或k+;
若有以下定义和语句:
int*p,*s,k=20;
s=,p,s,20,k,8.4对指针变量的操作,8.4.1通过指针来引用一个存储单元,程序举例:
例8.1用指针指向两个变量,通过指针运算选出值最小的那个数。
#includemain()inta,b,min,*pa,*pb,*pmin;
pa=,pa,pb,pmin,a,b,min,/*输入的值依次放入pa、pb所指存储单元中*/,scanf(“%d%d”,比如输入:
4132,41,32,a=41b=32,min=a;
41,if(ab)min=b;
32,min=32,8.4对指针变量的操作,8.4.2移动指针&
8.4.3指针比较,所谓移动指针就是对指针变量加上或减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。
假定在内存中开辟了如图所示的五个连续的、存放int类型整数的存储单元,并分别给它们取代号为:
a0、a1、a2、a3、a4。
这些代号所代表的存储单元中,分别有值为:
11、22、33、44、55。
a0a1a2a3a4,1122334455,例如:
int*p,*q;
p=,p,q=p+2;
q+;
q-;
p+;
q,q,q,p,当有:
inti,j,k;
i=*p;
j=*q;
k=q-p;
i,j,k,22442,指针比较,if(pq)printf(“ppointstolowermemorythanq.n”);
elseprintf(“qpointstolowermemorythanp.n”);
ppointstolowermemorythanq.,if(p=0)printf(“ppointstoNULL.N”);
8.5函数之间地址值的传递,8.5.1形参为指针变量时实参和形参之间的数据传递,例8.2程序举例。
#includeintmyadd(int*a,int*b)intsum;
sum=*a+*b;
returnsum;
main()intx,y,z;
printf(“Enterx,y:
”);
scanf(“%d%d”,x,y,z,Enterx,y:
2441,24,41,调用,传递,a,b,sum,sum=x+y;
65,退出函数,将变量sum的值作为这个函数的返回值,返回到他的调用处。
此时,该函数中的变量全部释放。
65,65,24+41=65,8.5函数之间地址值的传递,8.5.2通过传递地址值在被调用函数中直接改变调用函数中的变量的值,例8.3调用swap函数,交换主函数中变量x和y中的数据。
第七章例7.3的重写,#includevoidswap(int*,int*);
main()intx=30,y=20;
printf
(1)x=%dy=%dn,x,y);
swap(,/*函数说明语句*/,x,y,
(1)x=30y=20,调用,传递,a,b,t,
(2)a=30b=20,(3)a=20b=30,退出该函数,返回到它的调用处,该函数无返回值,因为该函数为void类型,此时该函数中的变量全部释放。
(4)x=20y=30,t=x;
x=y;
y=t;
30,20,20,30,8.5函数之间地址值的传递,8.5.2通过传递地址值在被调用函数中直接改变调用函数中的变量的值,例8.4编写函数order(int*a,int*b),使调用函数中的第一个实参总是存放两个数中的较小的数,第二参数存放两个数中较大的数。
#includevoidswap(int*x1,int*x2)intt;
t=*x1;
*x1=*x2;
*x2=t;
voidorder(int*a,int*b)if(*a*b)swap(a,b);
main()intx,y;
printf(Enterx,y:
);
scanf(%d%d,x,y,Enterx,y:
4124,41,24,x=41y=24,调用,a,b,传递,if(xy)swap(a,b);
调用并传递数据,x1,x2,t=x;
24,41,x=24y=41,8.5函数之间地址值的传递,8.5.3函数返回地址值,#includeint*fun(int*,int*);
main()int*p,i,j;
printf(Entertwonumber:
scanf(%d%d,/*函数说明*/,例8.5程序举例。
p,i,j,Entertwonumber:
99101,99,101,传递,a,b,if(ij)returna;
退出该函数,返回到它的调用处,该函数的返回值是一个地址(j的地址),所以该函数是一个指针类型。
退出时该函数中的变量全部释放。
i=99,j=101,*p=101,习题,一.选择题8.1若有定义:
intx,*pb;
则正确的赋值表达式是Apb=程序的输出结果是A5,2,3B-5,-12,-7C-5,-12,-17D5,-2,-7,A,B,B,习题,8.4若有以下程序:
#includemain()intk=2,m=4,n=6,*pk=后,*p的值是A20B30C21D318.6若指针p已正确定义并指向如图所示存储单元,则*+p的值是A20B30C21D318.7若指针p已正确定义并指向如图所示存储单元,则+*p的值是A20B30C21D31,a0a1a2a3a4,1020304050,p,C,B,B,C,习题,8.8若有以下程序:
#includevoidprtv(int*x)printf(%dn,+*x);
main()inta=25;
prtv(程序的输出结果是A运行错误B100Ca的地址Db的地址,D,B,习题,8.10若有以下程序:
#includevoidfun(float*a,float*b)floatw;
*a=*a+*a;
w=*a;
*a=*b;
*b=w;
main()floatx=2.0,y=3.0,*px=程序的输出结果是A4,3B2,3C3,4D3,2,8.11若有以下程序:
#includevoidsub(doublex,double*y,double*z)*y=*y-1.0;
*z=*z+x;
main()doublea=2.5,b=9.0,*pa,*pb;
pa=程序的输出结果是A9.000000B1.500000C8.000000D10.500000,C,C,习题,8.12以下四个程序中不能对两个整型值进行交换的是A#includeB#includevoidswap(int*p,int*q)voidswap(int*p,int*q)int*t,a;
intt;
t=,C,习题,二.填空题8.13以下程序段的输出结果是_.int*var,b;
b=100;
var=,110,71,