编程题1用指向数组的指针变量输出数组的全部元素#include<iostream.h>void main( ){ int a[10], i;int *p;for (i=0; i<10; i++)cin>>a[i];for (p=a; p<a+10; p++)cout<<*p<<‘\t’;}#include<iostream.h>void main( ){ int a[10], i;int *p=a;for (i=0; i<10; i++)cin>>a[i];for (i=0; i<10; i++)cout<<*p++<<‘\t’;}2 使用函数调用,形参为指针,实参为数组,把一个数组逆序存放在输出#include<iostream.h>void inv(int *x, int n);void main( ){ int i, a[10]={3,7,9,11,0,6,7,5,4,2};inv(a,10);for (i=0;i<10; i++)cout<<a[i]<<‘\t’;}void inv(int *x, int n){ int *p, t, *i, *j, m=(n-1)/2;i=x; j=x+n-1; p=x+m;for (; i<=p; i++,j--){ t=*i; *i=*j; *j=t;}}void inv(int x[ ], int n){ int t, i, j, m=(n-1)/2;for (i=0;i<=m; i++){ j=n-1-i;t=x[i]; x[i]=x[j]; x[j]=t;}}一判断题× 1.指针是变量,它具有的值是某个变量或对象的地址值,它还具有一个地址值,这两个地址值是相等的。
√ 2.指针的类型是它所指向的变量或对象的类型。
× 3.定义指针时不可以赋初值。
√ 4.指针可以赋值,给指针赋值时一定要类型相同,级别一致。
× 5.指针可以加上或减去一个int型数,也可以加上一个指针。
√ 6.两个指针在任何情况下相减都是有意义的。
√ 7.数组元素可以用下标表示,也可以用指针表示。
× 8.指向数组元素的指针只可指向数组的首元素。
√ 9.字符指针是指向字符串的指针,可以用字符串常量给字符指针赋值。
× 10.引用是一种变量,它也有值和地址值。
√ 11.引用是某个变量的别名,引用是被绑定在被引用的变量上。
√ 12.创建引用时要用一个同类型的变量进行初始化。
√ 13.指针是变量,它可以有引用,而引用不能有引用。
二单选题1.下列关于定义一个指向double型变量的指针,正确的是( B )。
A.int a(5);double *pd=a;B.double d(2.5),*pd=&d;C.double d(2.5),*pd=d;D.double a(2.5),pd=d;2.下列关于创建一个int型变量的引用,正确的是( A )。
A.int a(3),&ra=a;B.int a(3),&ra=&a;C.double d(3.1);int &rd=d;D.int a(3),ra=a;3.下列关于指针概念的描述中,错误的是( B )。
A.指针中存放的是某变量或对象的地址值B.指针的类型是它所存放的数值的类型C.指针是变量,它也具有一个内存地址值D.指针的值是可以改变的4.下列关于引用概念的描述中,错误的是( A )。
A.引用是变量,它具有值和地址值B.引用不可以作数组元素C.引用是变量的别名D.创建引用时必须进行初始化5.已知:int a[5],*p=a;则与++*p相同的是( D )。
A.*++p B.a[0]C.*p++ D.++a[0]6.已知:int a[ ]={1,2,3,4,5},*p=a;在下列数组元素地址的表示中,正确的是( C )。
A .&(a+1)B .&(p+1)C .&p[2]D .*p++7.已知:int a(5),&ra=a ;下列描述中,错误的是( D )。
A .ra 是变量a 的引用,即为变量的别名B .ra 的值为5C .ra 的地址值为&aD .改变ra 的值为10,变量a 值仍为58若有以下定义,则说法错误的是( D )。
int a=100,*p=&a ;A .声明变量p ,其中*表示p 是一个指针变量B .变量p 经初始化,获得变量a 的地址C .变量p 只可以指向一个整形变量D .变量p 的值为1009若有以下定义,则赋值正确的是(C )。
int a ,b , *p;float c, *q;A .p=&cB .q=pC .p=NULLD .q=new int10如果x 是整型变量,则合法的形式是( D )。
A .&(x+5)B .*xC .&*xD .*&x11若要建立如下关系,错误的语句组是( A )。
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;12若有语句int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a ;则( B )不是对a 数组元素的正确引用(其中0≤i<10)。
A .p[i]B .*(*(a+i))C .a[p-a]D .*(&a[i])13以下程序的输出结果是( B )。
#include <iostream.h>xpvoid main(){ int a[3]={10,15,20}; //a[0]=10,a[1]=15,a[2]=20int *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]=20cout<<a[1]<<endl;}A.5 B.10C.15 D.2014以下程序的输出结果是( C )。
#include <iostream.h>void fun(int x,int y,int *cp,int *dp){ cp=x+y; //*cp=30+50=80dp=x-y; //*dp=30-50=-20}void main(){ int a,b,c,d;a=30,b=50;fun(a,b,&c,&d);cout<<c<<","<<d<<endl;}A.50,30 B.30,50 C.80,-20 D.80,2015要求函数的功能是交换x和y中的值,且通过正确调用返回交换结果。
能正确执行此功能的函数是( A )。
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; }16以下程序的输出结果是( C )。
#include <iostream.h>void 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,1 C.5,8,6,1 D.8,8,8,8 答案:C分析:C++语言中的switch语句中,如果没有break语句,一旦满足某一条件进入,就一直运行到switch的结束,如在本题s[1]=’1’,除v1加1之外,v2和v3都要加1。
故运行结果是“5,,8,6,1”,选择C。
如果程序做下面修改:switch(s[k]){ default:v4++; break;case '1':v1++; break;case '3':v3++;break;case '2':v2++;break;}运行结果是“4,2,1,1”,选择A。
二、读下列程序结果1:写出下列程序运行结果:#include<iostream.h>void main(){int *pn, n=10,m=20;float *pf, px=3.14159,py=2.71828;pn=&n;*pn+=m;cout<<”n 现在的值是:”<<*pn<<endl;pf=&px;py+=5*(*pf);cout<<”py现在的值是:”<<py<<endl;}运行结果是:n 现在的值是: 30pf 现在的值是:18.42623分析:指针是通过在变量前加一个“*”来定义,使用用“*”加变量名存取指针所指的值,用运算“&”取变量的地址,但是不能存取无指向的指针所指向内容,这样会导致系统故障。
2:写出下列程序运行结果:#include<iostream.h>void main(){int I,*p,a[]={10,20,30,40,50,60};p=a;for(I=0;I<5;I++)cout<<”a[“<<I<<”]=”<<a[I]<<’\t’<<”*(a+”<<I<<”)=”<<*(a+I)<<’\t’<<”*(p+”<<I<<”)=”<<*(p+I)<<’\t’<<”p[“<<I<<”]=”<<p[I]<<endl;}运行结果:a[0]=10 *(a+0)=10 *(p+0)=10 p[0]=10a[1]=20 *(a+1)=20 *(p+1)=20 p[1]=20a[2]=30 *(a+2)=30 *(p+2)=30 p[2]=30a[3]=40 *(a+3)=40 *(p+3)=40 p[3]=40a[4]=50 *(a+4)=50 *(p+4)=50 p[4]=50a[5]=60 *(a+5)=60 *(p+5)=60 p[5]=603:void grt(int *x , int *y , int *z){ cout<< ++*x<<‘,’<< ++*y<<‘,’<<*(z++)<<endl;}int a=10, b=40, c=20;void main( ){ prt (&a, &b, &c);prt (&a, &b, &c);}答案:11,41,20,12,42,204 static int a[ ]={1, 3,5, 7, 11, 13};main( ){ int *p;p=a+3;cout<<*p<<'\t'<<(*p++)<<endl;cout<<*(p-2)<<'\t'<<*(a+4)<<endl;}答案 11,75,11三;填空题1.下列函数change的功能是,将字符串中的小写字母转成大写字母,请填空。