C语言全国计算机二级等级考试教程d第八章地址和指针章节带习题.ppt
- 文档编号:18693680
- 上传时间:2023-09-16
- 格式:PPT
- 页数:19
- 大小:1.03MB
C语言全国计算机二级等级考试教程d第八章地址和指针章节带习题.ppt
《C语言全国计算机二级等级考试教程d第八章地址和指针章节带习题.ppt》由会员分享,可在线阅读,更多相关《C语言全国计算机二级等级考试教程d第八章地址和指针章节带习题.ppt(19页珍藏版)》请在冰点文库上搜索。
第8章地址和指针,8.1变量的地址和指针8.2指针变量的定义和指针变量的基类型8.3给指针变量赋值8.4对指针变量的操作8.5函数之间地址值的传递,考试的重点,8.1变量的地址和指针,计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号就成为内存地址。
内存空间,地址,10101011101210131014,10151016,:
:
120012011202120312041205,例如:
shorta,b;floatx;a=3;b=5;x=3.5;,:
:
2002200320042005,a,b,x,3,5,3.5,每个变量的地址是指该变量所占存储单元的第一个字节的地址。
在C语言中,我们可以定义整型变量、实型变量、字符变量。
他们都是用来存放数据的。
今天,我们来学习一下特殊的变量,这种变量只是用来存放内存地址的。
比如我们定义了一个指针变量p,p,占4个字节,该变量中只能存放内存地址,比如把变量a的地址赋予指针变量p,则指针变量p的值为1012。
1012,请问,当访问变量a时,访问的是什么?
当访问指针变量p时,访问的是什么?
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;,int*p;p=0;,int*p;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;k=1;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+;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;x=y;y=t;,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,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 全国计算机 二级 等级 考试 教程 第八 地址 指针 章节 习题