C++新手指针习题
谁能给我出几个新手指针的习题.. 给我习题集也可以 我刚学 谢谢了
谁能给我出几个新手指针的习题.. 给我习题集也可以 我刚学 谢谢了
答案:三、填空题
1. 下列函数change的功能是,将字符串中的小写字母转成大写字母,请填空。
#include<iostream>
void change( ) //1
{int i=0;
for(i=0; ;i++) //2
if(a[i]>='a'&&a[i]<='z')
; //3
}
int main()
{ char p[80];
cout<<" \n";
cin.getline(p,80) ; //读一行字符,中间可以有空格
change(p);
cout<<p<<endl;
}
如程序运行时得到以下结果:
请输入一行字符:
This is a book..
THIS IS A BOOK.
答案:(1)char *a 或 char a[80]
(2) a[i] 或 a[i]!=’\0’
(3) a[i]= a[i] –32或a[i]-= a[i]
2. 下列函数swap实现数据交换功能功能,请填空。
#include<iostream>
void swap(int *p,int *q)
{ int temp;
temp=*p;
; //1
; //2
}
int main()
{ int a,b;
int *p1,*p2;
cout<<"请输入两个正数:";
cin>>a>>b;
p1=&a;
p2=&b;
swap(p1,p2);
cout<<"结果a和b的值:"<<a<<","<<b<<endl;
}
如程序运行时得到以下结果:
请输入两个正数:10 20
结果a和b的值:20,10
答案:
(1) *p=*q
(2) *q=temp;
3. 下列函数sort实现对字符串按字典顺序由小到大排序,请填空。
#include<iostream>
void sort( ) //1
{ char ; //2
int i,j;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(strcmp( ) //3
{ temp=p[j];
; //4
p[j+1]=temp;
}
}
int main()
{
char *a[5]={"student","worker","cadre","soldier","apen"};
sort(a,5);
for(int i=0;i<5;i++)
cout<<a[i]<<endl;
}
程序运行结果如下:
apen
cadre
soldier
student
worker
答案:(1)char *p[],int n
(2)*temp
(3)p[j],p[j+1])>0
(4)p[j]=p[j+1]
4.函数find功能是:在指针p所指数组中,查找值为x的元素,找到后,返回该元素的下标,否则返回-1,改正程序中语句错误,能够正确运行。
#include<iostream>
#include<stdlib.h>
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
}
int main()
{ int i,pos,x;
int *p=new int [N];
for(i=0;i<N;i++)
*(p+i)=rand()%50;
for(i=0;i<N;i++)
cout<<*(p+i)<<'\t';
cout<<"\ninput x: ";
cin>>x;
pos=find(p,N,x);
if(pos!=-1)cout<<"index= "<<pos<<" ,value= "<<*(p+pos)<<endl;
else cout<<"No find!"<<endl;
}
答案:(1) 2行语句改为 int i=0;
(2) 4行语句改为 while(*(p+i)!=x);
(3) 7行语句改为 return i 。
四、编程题
1. 写一个函数,将一个n阶方阵转置。具体要求如下:
(1)初始化一个矩阵A(5×5),元素值取自随机函数,并输出。
(2)将其传递给函数,实现矩阵转置。
(3) 在主函数中输出转置后的矩阵。(提示:程序中可以使用C++库函数rand( ),其功能是产生一个随机数0~65535,其头文件为stdlib.h)
2.使用指针编写函数strcat(),实现两个字符串的首尾连接(将字符串str2接到str1的后面,str1最后面的‘\0’被取消)。
3.编写从多个字符串中寻找最长串的函数
4.编写一个程序,实现在命令行中以参数的形式接收两个整数,输出这两个整数的和。(提示:程序中可以使用C++库函数atoi(),其功能是将字符串转换成整型值,其头文件为stdlib.h)你能准确的做到以上的题目,基本上你对指针的概念和基本应用都可以了,接着你要学习的是特定指针了,比如字符串指针,函数指针是非常重要的知识点:
1.掌握指针、地址、指针类型、空指针(NULL)等概念;
2.掌握指针变量的定义和初始化、指针的间接访问、指针的加减运算、指针变量比较运算和指针表达式;
3.掌握指针与数组、函数、字符串等的联系;
4.掌握引用参数的使用。
一、选择题
1.若有以下定义,则说法错误的是( )。
int a=100,*p=&a ;
A.声明变量p,其中*表示p是一个指针变量
B.变量p经初始化,获得变量a的地址
C.变量p只可以指向一个整形变量
D.变量p的值为100
2. 若有以下定义,则赋值正确的是( )。
int a ,b , *p;
float c, *q;
A.p=&c B.q=p C.p=NULL D.q=new int
3. 如果x是整型变量,则合法的形式是( )。
A.&(x+5)B.*x C.&*x D.*&x
4. 若有语句int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则( )不是对a数组元素的正确引用(其中0≤i<10)。
A.p[i] B.*(*(a+i))C.a[p-a]D.*(&a[i])
5. 以下程序的输出结果是( )。
#include <iostream>
int main()
{ int a[3]={10,15,20}; // a[0]=10,a[1]=15,a[2]=20
int *p1=a,*p2=&a[1]; // p1取a[0]地址,p2取a[1]地址
*p1=*(p2-1)+5; // a[0]=15,a[1]=15,a[2]=20
*(p1+1)=*p1-5; // a[0]=15,a[1]=10,a[2]=20
cout<<a[1]<<endl;
}
A.5B.10C.15D.20
6. 执行以下程序段后,m的值为 ( )。
int a[2][3]={{1,2,3},{4,5,6}};
int m,*p=&a[0][0];
m=(*p)*(*(p+2))*(*(p+4));
A.15B.14C.13D.12
7. 以下程序的输出结果是( )。
#include <iostream>
void fun(int x,int y,int *cp,int *dp)
{ *cp=x+y; //*cp=30+50=80
*dp=x-y; //*dp=30-50=-20
}
int main()
{int a,b,c,d;
a=30,b=50;
fun(a,b,&c,&d);
cout<<c<<","<<d<<endl;
}
A.50,30B.30,50C.80,-20D.80,20
8. 要求函数的功能是交换x和y中的值,且通过正确调用返回交换结果。能正确执行此功能的函数是( )。
A.funa(int *x,int *y)B.funb(int x,int y)
{ int *p=new int ;{ int t;
p=*x; t=x;
*x=*y; x=y;
*y=*p; y=t;
} }
C.func(int *x,int *y)D.fund(int x,int y)
{ *x=*y;{*x=*x+*y;
*y=*x; *y=*x-*y;
} *x=*x-*y;
}
9. 以下程序的输出结果是( )。
#include <iostream>
int main()
{char *s="12134211";
int v1=0,v2=0,v3=0,v4=0;
for (int k=0;s[k];k++)
switch(s[k])
{default:v4++;
case '1':v1++;
case '3':v3++;
case '2':v2++;
}
cout<<v1<<","<<v2<<","<<v3<<","<<v4<<endl;
}
A.4,2,1,1 B.4,9,3,1C.5,8,6,1D.8,8,8,8
10. 若有如下语句:
int **pp,*p,a=10,b=20;
pp=&p; //二级指针pp取一级指针p地址
p=&a; //一级指针p取变量a地址
p=&b; //一级指针p取变量b地址
cout<<*p<<”,”<<**pp<<endl;
则输出结果是( )。
A.10,20B.10,10C.20,10D.20,2011.若有以下定义,则变量p所占内存空间的字节数是( )。
float *p;
A.1 B.2 C.4 D.8
12.若有以下定义,则赋值错误的是( )。
int a,*p,*q;
A. *p=&a ; B.p=new int ; C.q=NULL; D.p=q
13. 下列程序运行结果是( )。
#include<iostream>
int main()
{ int a=10,*q;
if(q==NULL)
cout<<"####"<<endl;
else
q=&a;
cout<<*q<<endl;
}
A. #### B.10 C. 有语法错误 D.*q
14. 若程序段static char line[]=”Visual C++”; char *point=line;则point的值为( )。
A. ”Visual C++” B. line的首地址 C. Visual D. \0
15. 相同数据类型的数组名和指针变量均表示地址,以下不正确的说法是( )。
A. 数组名代表的地址不变,指针变量存放的地址可变。
B. 数组名代表的存储空间不变,指针变量指向的存储空间长度可变。
C. A和B的说法均正确。
D. 没有差别。
16. 若有以下定义,则下列操作错误的是( )。
int a[5]={1,3,5,7,9},*p=new int [5];
A.p=a; B.*p=a; C.*(p+1)=a[1]; D.*p=*a
17. 若有以下定义,则释放指针所指内存空间的操作是( )。
int上一个:关于C++指针和引用
下一个:C++的4道选择题