您好,欢迎访问三七文档
一、知识点1.掌握指针、地址、指针类型、空指针(NULL)等概念;2.掌握指针变量的定义和初始化、指针的间接访问、指针的加减运算、指针变量比较运算和指针表达式;3.掌握指针与数组、函数、字符串等的联系;4.掌握动态空间操作(new,delete);5.掌握引用参数的使用。二、例题分析与解答例题1:若有以下定义,则说法错误的是()。inta=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:若有以下定义,则赋值正确的是()。inta,b,*p;floatc,*q;A.p=&cB.q=pC.p=NULLD.q=newint答案:C分析:指针变量使用规定,不同类型的指针变量不能赋值,也不能取得普通变量地址,故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:若要建立如下关系,错误的语句组是()。spanstyle='mso-ignore:vglayout;;z-index:1;left:0px;margin-left:144px;margin-top:1px;width:256px;height:38px'A.B.C.D.int*p=&x,x;intx,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:若有语句inta[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则()不是对a数组元素的正确引用(其中0≤i10)。A.p[i]B.*(*(a+i))C.a[p-a]D.*(&a[i])答案:B分析:指针就变量p取得数组a的首地址,由指针与数组关系知,p[i]表示数组元素第i+1元素值,p[i]=a[i]正确,故A不能选。*(a+i)表示一维数组a第i+1元素值,*(*(a+i)表示对第i+1元素值再取值是错误操作,所以选B。a[p-a]=a[0]正确,故不能选择C。*(&a[i])也正确(见上题),也不能选D。例题6:写出下列程序运行结果是()。#includevoidmain(){charch[3][4]={“AAA”,”BB”,”CCC”},(*q)[4]=ch,*p;//ch是二维数组,q是指向一维数组指针,并且一维数组每行只有4个字符//q并取得二维数组ch首地址inti;p=newchar;//申请地址*p=’b’;//装入字符b*(*q+3)=*p;for(i=0;i3;i++)coutQ[I]ENDL;SPAN}A.B.C.D.AAAbBBAAAbAAAAAABBBBbBBBBCCCCCCCCCCCC答案:A分析:二维字符数组初始化后值如下表:01230AAA\01BB\02CCC\0执行语句*(*q+3)=*p后二维字符数组值:01230AAAb1BB\02CCC\0在输出语句中q[0]输出是AAAbBB,q[1]输出是BB,q[2]输出CCC,只能选择A。例题7:写出下列程序运行结果:#includevoidmain(){int*pn,n=10,m=20;float*pf,px=3.14159,py=2.71828;pn=&n;*pn+=m;cout”n现在的值是:”*pnENDL;SPANpf=&px;py+=5*(*pf);cout”py现在的值是:”PYENDL;SPAN}运行结果是:n现在的值是:30pf现在的值是:18.4262分析:指针是通过在变量前加一个“*”来定义,使用用“*”加变量名存取指针所指的值,用运算“&”取变量的地址,但是不能存取无指向的指针所指向内容,这样会导致系统故障。例题8:写出下列程序运行结果:#includevoidmain(){intI,*p,a[]={10,20,30,40,50,60};p=a;for(I=0;I5;I++)cout”a[“IA[I]’\T’”*(A+”I*(A+I)SPAN’\t’”*(p+”I*(P+I)’\T’”P[“IP[I]ENDL;SPAN}运行结果:a[0]=10*(a+0)=10*(p+0)=10p[0]=10a[1]=20*(a+1)=20*(p+1)=20p[1]=20a[2]=30*(a+2)=30*(p+2)=30p[2]=30a[3]=40*(a+3)=40*(p+3)=40p[3]=40a[4]=50*(a+4)=50*(p+4)=50p[4]=50a[5]=60*(a+5)=60*(p+5)=60p[5]=60分析:分析程序根据指针与数组关系,引用数据可以有四种不同的表示方法:使用数组下标变量;使用数据固有的指针——数组名间接引用;使用指向数组的指针的间接引用;使用指向数组的指针下标引用。例题9:指出下列程序运行结果:#includeintb[4][4]={{10,11,12,13},{14,15,16,17},{18,19,20,21},{22,23,24,25}};voidmain(){int(*a)[4],*p;a=b;//指针变量a,取得二维数组第一行地址p=a[1];//指针变量p,取得二维数组第二行第一列地址for(intI=1;I=4;p=p+1,I++)//A行cout*p'\t';coutENDL;SPANfor(I=0;I=3;I++)//B行{cout*(*a+1)'\t';a++;}//C行coutENDL;SPAN}运行结果是:1415161711151923分析:根据题意,指针变量p取得二维数组第二行第一列地址,进行循环语句后,每循环一次,指针变量下移一个元素,A行循环输出是14,15,16,17。指向一维数组指针a,取得二维数组第一行地址,由指向一维数组指针定义,*a+1表示该行第一列元素地址,*(*a+1)表示该地址的值,所以B行输出是11,15,19,23。例题10:写出下列程序运行结果:#includevoidfun(int*&a,int&m){a=newint[m];//Aint*p=a;for(inti=0;iM;I++)SPAN*p++=i*i+1;}voidmain(){int*b,n=5;fun(b,n);for(inti=0;iN;I++)SPANcoutB[I]'SPAN?;coutENDL;SPANdelete[]b;//B}运行结果是:1251017分析:指针变量在函数main中没有取得地址,所以在A行中,对被调用函数fun给对应的形参指针变量申请地址,即指针变量b和形参指针变量p指向同一组地址。B行对申请地址释放。例题11:下列函数change的功能是,将字符串中的小写字母转成大写字母,请填空。#include#includevoidchange()//1{inti=0;for(i=0;;i++)//2if(a[i]='a'&&a[i]='z');//3}voidmain(){charp[80];cout\n;cin.getline(p,80);//读一行字符,中间可以有空格change(p);coutPENDL;SPAN}如程序运行时得到以下结果:请输入一行字符:Thisisabook..THISISABOOK.答案:(1)char*a或chara[80](2)a[i]或a[i]!=’\0’(3)a[i]=a[i]–32或a[i]-=a[i]分析:(1)由指针和字符串关系知:当实参是数组,形参可以是字符串变量,也可以是字符指针变量。(2)循环语句结束条件是字符标记’\0’。(3)大写字母的ASCII码比小室字母的ASCII码小32。例题12:下列函数swap实现数据交换功能功能,请填空。#includevoidswap(int*p,int*q){inttemp;temp=*p;;//1;//2}voidmain(){inta,b;int*p1,*p2;cout请输入两个正数:;cinab;p1=&a;p2=&b;swap(p1,p2);cout结果a和b的值:A,BENDL;SPAN}如程序运行时得到以下结果:请输入两个正数:1020结果a和b的值:20,10答案:(1)(1)*p=*q(2)(2)*q=temp;分析:实参和形参都是指针变量,所以指针变量p1和p指向同一个地址,同样p2和q也指向同一个地址。函数swap()是交换两个数,故应填写语句*p=*q、*q=temp。例题13:下列函数sort实现对字符串按字典顺序由小到大排序,请填空。#include#includevoidsort()//1{char;//2inti,j;for(i=0;iN-1;I++)SPANfor(j=0;jN-1-I;J++)SPANif(strcmp()//3{temp=p[j];;//4p[j+1]=temp;}}voidmain(){char*a[5]={student,worker,cadre,soldier,apen};sort(a,5);for(inti=0;i5;i++)coutA[I]ENDL;SPAN}程序运行结果如下:apencadresoldierstudentworker答案:(1)char*p[],intn(2)*temp(3)p[j],p[j+1])0(4)p[j]=p[j+1]分析:(1)由实参得知函数sort()有两个形参,根据上题得char*p[],intn。(2)有下面语句temp=p[j]可以得到temp是字符中指针。(3)根据冒泡排序方法和字符串比较函数得到p[j],p[j+1])0。(4)字符串指针可以通过赋值语句传递值,字符串变量不能够使用赋值语句传递值。例题14:函数find功能是:在指针p所指数组中,查找值为x的元素,找到后,返回该元素的下标,否则返回-1,改正程序中语句错误,能够正确运行。#include#includeconstintN=10;intfind(int*p,intn,intx)//1{inti;//2*(p+n)=x;//3while(*p+i!=x)//4i++;//5if(i!=n)//6return1;//7elsereturn-1;//8}voidmain(){inti,pos,x;int*p=newint[N];for(i=0;iN;I++)SPAN*(p+i)=rand()%50;for(i=0;iN;I++)SPANcout*(p+i)'\t';cout\ninputx:;cinx;pos=find(p,N,x);if(pos!=-1)coutindex=POSchar?LAYOUT-GRID-MODE:18pt;MARGIN-LEFT:,value=*(p+pos)endl;el
本文标题:C语言指针练习题
链接地址:https://www.777doc.com/doc-2907962 .html