最新C语言指针练习题解析.doc
《最新C语言指针练习题解析.doc》由会员分享,可在线阅读,更多相关《最新C语言指针练习题解析.doc(107页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateC语言指针练习题解析C语言指针练习题解析一、知识点1 掌握指针、地址、指针类型、空指针(NULL)等概念;2 掌握指针变量的定义和初始化、指针的间接访问、指针的加减运算、指针变量比较运算和指针表达式;3 掌握指针与数组、函数、字符串等的联系;4 掌握动态空间操作(new,delete);5 掌握引用参数的使用。二、例题分析与解答例题1:若有以下定义,则说法错误的是(
2、)。 int a=100,*p=&a ;A声明变量p,其中*表示p是一个指针变量B变量p经初始化,获得变量a的地址C变量p只可以指向一个整形变量D变量p的值为100答案:D分析:有指针变量定义可知A、C说法是正确的,故不能选。在语句中&p=a,表示指针变量取得变量a地址,B说法也正确,也不能选择。D中不能说变量p的值为100,应该*p的值为100,所以选择D。例题2:若有以下定义,则赋值正确的是( )。int a ,b , *p;float c, *q;Ap=&c Bq=p Cp=NULL Dq=new int答案:C分析:指针变量使用规定,不同类型的指针变量不能赋值,也不能取得普通变量地址,
3、故A、B不正确,不能选择。因为q是float类型指针变量,不能申请int 类型地址,D不正确,也不能选择。因为任何类型的指针变量都能取得NULL指针,所以C正确。例题3:如果x是整型变量,则合法的形式是( )。A(x+5)B*xC&*xD*&x答案:D分析:因为C+语言表达式没有地址,A不正确。C+语言普通变量不能用*运算,因此B和C也不正确。&x表示变量x的地址,*&x是x 地址的值,所以D正确。例题4:若要建立如下关系,错误的语句组是( )。span style=mso-ignore:vglayout; ;z-index:1;left:0px;margin-left:144px;margi
4、n-top:1px; width:256px;height:38px A B C D int *p=&x, x; int x, p=&x; int *p, x=10; int *p, x; *p=10; *p=10; *p=&x; p=&x ; x=10;答案:A分析:在变量类型说明语句中 *表示变量是指针变量,在其他语句中,*称为指针运算,用于访问指针所指向的对象的值,&称为取地址运算,用来得到一个对象的地址。故B、C、D都是正确的,不能选择。A中指针变量p取不到x地址,因为x还没有定义,所以选择A。例题5:若有语句int a10=0,1,2,3,4,5,6,7,8,9,*p=a;则( )不
5、是对a数组元素的正确引用(其中0i10)。ApiB*(*(a+i)Cap-aD*(&ai)答案:B分析:指针就变量p取得数组a的首地址,由指针与数组关系知,pi表示数组元素第i+1元素值,pi=ai正确,故A不能选。*(a+i)表示一维数组a第i+1元素值,*(*(a+i)表示对第i+1元素值再取值是错误操作,所以选B。ap-a=a0正确,故不能选择C。*(&ai)也正确(见上题),也不能选D。例题6:写出下列程序运行结果是( )。 #include void main() char ch34=“AAA”,”BB”,”CCC”,(*q)4=ch, *p; / ch是二维数组, q是指向一维数组
6、指针,并且一维数组每行只有4个字符/q并取得二维数组ch首地址int i; p=new char; /申请地址*p=b; /装入字符b*(*q+3)=*p; for(i=0;i3;i+) coutQIENDL;A B C D AAAbBB AAAb AAA AAA BB BB bBB BB CCC CCC CCC CCC答案:A分析:二维字符数组初始化后值如下表: 01230AAA01BB02CCC0执行语句*(*q+3)=*p后二维字符数组值:01230AAAb1BB02CCC0在输出语句中q0输出是AAAbBB,q1输出是BB,q2输出CCC,只能选择A。例题7:写出下列程序运行结果:#i
7、ncludevoid main()int *pn, n=10,m=20; float *pf, px=3.14159,py=2.71828; pn=&n; *pn+=m; cout”n 现在的值是: ”*pnENDL; pf=&px; py+=5*(*pf); cout”py现在的值是:”PYENDL;运行结果是: n 现在的值是: 30pf 现在的值是:18.4262分析:指针是通过在变量前加一个“*”来定义,使用用“*”加变量名存取指针所指的值,用运算“&”取变量的地址,但是不能存取无指向的指针所指向内容,这样会导致系统故障。例题8:写出下列程序运行结果:#includevoid main
8、()int I,*p,a=10,20,30,40,50,60; p=a; for(I=0;I5;I+) cout”a“IAIT”*(A+”I*(A+I)t”*(p+”I*(P+I)T”P“IPIENDL;运行结果:a0=10 *(a+0)=10 *(p+0)=10 p0=10 a1=20 *(a+1)=20 *(p+1)=20 p1=20 a2=30 *(a+2)=30 *(p+2)=30 p2=30 a3=40 *(a+3)=40 *(p+3)=40 p3=40 a4=50 *(a+4)=50 *(p+4)=50 p4=50 a5=60 *(a+5)=60 *(p+5)=60 p5=60 分
9、析:分析程序根据指针与数组关系,引用数据可以有四种不同的表示方法:使用数组下标变量;使用数据固有的指针数组名间接引用;使用指向数组的指针的间接引用;使用指向数组的指针下标引用。例题9:指出下列程序运行结果:#includeint b44=10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25;void main()int (*a)4,*p; a=b; /指针变量a,取得二维数组第一行地址p=a1; /指针变量p,取得二维数组第二行第一列地址 for( int I=1;I=4;p=p+1,I+) /A行 cout*pt;coutENDL;for( I=0;
10、I=3;I+) /B行 cout*(*a+1)t; a+; /C行coutENDL;运行结果是:14 15 16 1711 15 19 23分析:根据题意,指针变量p取得二维数组第二行第一列地址,进行循环语句后,每循环一次,指针变量下移一个元素,A行循环输出是14,15,16,17。指向一维数组指针a,取得二维数组第一行地址,由指向一维数组指针定义,*a+1表示该行第一列元素地址,*(*a+1)表示该地址的值,所以B行输出是11,15,19,23。例题10:写出下列程序运行结果:#includevoid fun(int *& a, int &m) a=new intm; /A int * p=
11、a; for(int i=0;iM;I+) *p+=i*i+1; void main() int *b,n=5; fun(b,n); for(int i=0;iN;I+) coutBI SPAN ?; coutENDL; deleteb; /B运行结果是:1 2 5 10 17分析:指针变量在函数main中没有取得地址,所以在A行中,对被调用函数fun给对应的形参指针变量申请地址,即指针变量b和形参指针变量p指向同一组地址。B行对申请地址释放。例题11:下列函数change的功能是,将字符串中的小写字母转成大写字母,请填空。#include#includevoid change( ) /1in
12、t i=0; for(i=0; ;i+) /2 if(ai=a&ai=z) ; /3void main()char p80; cout n; cin.getline(p,80) ; /读一行字符,中间可以有空格 change(p); coutPENDL;如程序运行时得到以下结果:请输入一行字符:This is a book.THIS IS A BOOK.答案:(1)char *a 或 char a80(2) ai 或 ai!=0(3) ai= ai 32或ai-= ai 分析: (1) 由指针和字符串关系知:当实参是数组,形参可以是字符串变量,也可以是字符指针变量。(2) 循环语句结束条件是字
13、符标记0。(3) 大写字母的ASCII码比小室字母的ASCII码小32。 例题12:下列函数swap实现数据交换功能功能,请填空。#includevoid swap(int *p,int *q)int temp; temp=*p; ; /1 ; /2void main()int a,b;int *p1,*p2;coutab;p1=&a;p2=&b;swap(p1,p2);cout结果a和b的值:A,BENDL;如程序运行时得到以下结果:请输入两个正数:10 20结果a和b的值:20,10答案:(1) (1) *p=*q(2) (2) *q=temp;分析:实参和形参都是指针变量,所以指针变量p
14、1和p指向同一个地址,同样p2和q也指向同一个地址。函数swap()是交换两个数,故应填写语句*p=*q、*q=temp。例题13:下列函数sort实现对字符串按字典顺序由小到大排序,请填空。#include#includevoid sort( ) /1char ; /2 int i,j; for(i=0;iN-1;I+) for(j=0;jN-1-I;J+) if(strcmp( ) /3 temp=pj; ; /4 pj+1=temp; void main() char *a5=student,worker,cadre,soldier,apen; sort(a,5); for(int i=
15、0;i5;i+) coutAIENDL;程序运行结果如下:apencadresoldierstudentworker答案:(1)char *p,int n (2)*temp(3)pj,pj+1)0(4)pj=pj+1分析:(1)由实参得知函数sort()有两个形参,根据上题得char *p,int n。(2)有下面语句temp=pj可以得到temp是字符中指针。(3)根据冒泡排序方法和字符串比较函数得到pj,pj+1)0。(4)字符串指针可以通过赋值语句传递值,字符串变量不能够使用赋值语句传递值。例题14:函数find功能是:在指针p所指数组中,查找值为x的元素,找到后,返回该元素的下标,否则
16、返回-1,改正程序中语句错误,能够正确运行。#include #include const int N=10; int find(int *p,int n,int x) /1 int i ; / 2 *(p+n)=x; /3 while(*p+i!=x) /4 i+; /5 if(i!=n) /6 return 1; /7 else return -1; /8 void main() int i,pos,x; int *p=new int N; for(i=0;iN;I+) *(p+i)=rand()%50; for(i=0;iN;I+) cout*(p+i)t; coutx; pos=fin
17、d(p,N,x); if(pos!=-1)coutindex= POS char? LAYOUT-GRID-MODE: 18pt; MARGIN-LEFT: ,value=*(p+pos)endl; else coutNo find!ENDL; 答案:(1) 2行语句改为 int i=0;(2) 4行语句改为 while(*(p+i)!=x);(3) 7行语句改为 return i 。分析:在函数find中,变量i没有赋初值,按照规则任意取值,所以程序不正确。在while循环条件中*p+i表示指针p指向地址元素值加i,不能起着指针移动作用,改为*(p+i)表示数组第i个元素值起着顺序查找作用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 语言 指针 练习题 解析
限制150内