C语言指针练习题解析 下载本文

{ cp=x+y; //*cp=30+50=80 }

void main() { } A.50,30

答案:C

分析:函数fun(a,b,&c,&d)中参数 a,b是传值,参数&c,&d是传地址,因此形参cp和实参c

共用一个存储空间,形参dp和实参d共用一个存储空间,所以改变指针变量cp所指向地址的值也就改变变量c的值,同样改变指针变量dp所指向地址的值也就改变变量d的值,因此选C。

(6)要求函数的功能是交换x和y中的值,且通过正确调用返回交换结果。能正确执行此功能的函数是( )。

A.funa(int *x,int *y) { int *p=new int ; p=*x;

B.funb(int x,int y) { int t;

B.30,50

C.80,-20

D.80,20

int a,b,c,d; a=30,b=50; fun(a,b,&c,&d);

cout<

t=x; x=y; y=t; }

*x=*y; *y=*p; }

C.func(int *x,int *y) {

*x=*y;

D.fund(int x,int y) {

*x=*x+*y;

*y=*x; }

答案:A

*y=*x-*y; *x=*x-*y; }

分析:按照C++语言规则,通过参数带回运算值,只能是传地址,不能是传值 ,B和D的参数是传值,故B和D不能选。C中传回值都是指针变量y所指向地址的值,C也不能选。

(7)以下程序的输出结果是( )。 #include void main() { }

A.4,2,1,1 B.4,9,3,1

答案:C

分析:C++语言中的switch语句中,如果没有break语句,一旦满足某一条件进入,就一直运行到switch的结束,如在本题s[1]=’1’,除v1加1之外,v2和v3都要加1。故运行结果是“5,,8,6,1”,选择C。如果程序做下面修改:

C.5,8,6,1

D.8,8,8,8

char *s=\ 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<

switch(s[k])

{ }

default:v4++; break; case '1':v1++; break; case '3':v3++;break; case '2':v2++;break;

运行结果是“4,2,1,1”,选择A。

(8)设有如下定义,下面关于ptr正确叙述是( )。

int (*ptr)();

A.ptr是指向一维数组的指针变量 B.ptr是指向int 型数据的指针变量

C.ptr是指向函数的指针,该函数返回一个int型数据 D.ptr是一个函数名,该函数的返回值是指向int型数据的指针

答案:C

分析:参照函数指针定义。

(9)若有如下语句:

int **pp,*p,a=10,b=20;

pp=&p; //二级指针pp取一级指针p地址 p=&a; //一级指针p取变量a地址 p=&b; //一级指针p取变量b地址 cout<<*p<<”,”<<**pp<

A.10,20

答案:D

分析:见程序注释。

B.10,10 C.20,10

D.20,20

(10)设char **s;以下正确的表达式是( )。

A.s=”computer”; B.*s=”computer”; C.**s=”computer”;D.*s=’c’;

答案:C

分析:由char**s语句可知,**s表示是一个二级字符指针变量,*s是一个指向字符串的指针变量,故A、C、D都 不正确,只有B是正确的。

2.编写程序,在堆内存中申请一个float型数组,把10个float型数据0.1、0.2、0.3、…、1.0赋予该数组,然后使用float型指针输出该数组的各元素值并求出其累加和。

#include void main()

{ float *p= new float[10]; //在堆内申请一个float型数组 int i; float sum=0.0;

for(i=0;i<10;i++)

{*(p+i)=(i+1)*.1; //给数组赋值0.1,0.2,……,1.0 cout<<*(p+i)<<'\\t'; //输出数组值

sum+=*(p+i); //求和 }

cout<<\ }

3.编写一个函数f,将传入此函数的直角坐标值转换为极坐标值,并返回主调函数中。求极坐标的公式是:

c=

q=arctan(y/x)

若要将两值返回主调函数,有多种方式可以完成,请试之: (1) (1) 两值均以指针形参带回。

void fun(double x,double y,double *c,double *q) { cout< *c=sqrt(x*x+y*y); cout<<*c< *q=atan(y/x); }

(2)由指针形参带回一个值,函数值返回另一个值。 double fun(double x,double y,double *p) {double c; c=sqrt(x*x+y*y); *p=atan(y/x); return c; }

(3)两值均以引用形参返回。

(提示:程序中可以使用C++库函数sprt、pow及atan,它们的头文件为math.h) void fun(double x,double y,double &a,double &b) {

a=sqrt(x*x+y*y);

b=atan(y/x);