函数指针与结构体练习题参考答案.docx
《函数指针与结构体练习题参考答案.docx》由会员分享,可在线阅读,更多相关《函数指针与结构体练习题参考答案.docx(20页珍藏版)》请在冰点文库上搜索。
函数指针与结构体练习题参考答案
函数
(一)选择题
1.以下正确的说法是_________.
建立函数的目的之一是a)提高程序的执行效率
b)提高程序的可读性
c)减少程序的篇幅
d)减少程序文件所占内存
2.以下正确的函数原型声明形式是________.
a)doublefun(intx,inty)
b)doublefun(intx;inty)
c)doublefun(intx,inty);
d)doublefun(intx,y);
3.C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式为______.
A)地址传递
B〕单向值传递
C〕由实参传给形参,再由形参传回给实参
D〕由用户指定传递方式
4.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是______.
a)float
b)int
c)long
d)double
5.已有以下数组定义和f函数调用语句,那么在f函数的说明中,对形参数组array
的错误定义方式为________.
inta[3][4];
f(a);
a)f(intarray[][6])
b)f(intarray[3][])
c)f(intarray[][4])
d)f(intarray[2][5])
6.以下程序的正确运行结果是_________.
#include
voidnum()
{externintx,y;inta=15,b=10;
x=a-b;
y=a+b;
}
intx,y;
main()
{
inta=7,b=5;
x=a+b;
y=a-b;
num();
printf("%d,%d\n",x,y);
}
a)12,2b)不确定c)5,25d)1,12
7.以下正确的描述是____________.
a)C语言的预处理功能是指完成宏替换和包含文件的调用
b)预处理指令只能位于C源程序文件的首部
c)但凡C源程序中行首以"#"标识的控制行都是预处理指令
d)C语言的编译预处理就是对源程序进行初步的语法检查
8.在"文件包含"预处理语句的使用形式中,当#include后面的文件名用<>(尖括号)括起时,找寻被包含文件的方式是_______.
a)仅仅搜索当前目录
b)仅仅搜索源程序所在目录
c)直接按系统设定的标准方式搜索目录
d)先在源程序所在目录搜索,再按照系统设定的标准方式搜索
9. 当调用函数时,实参是一个数组名,那么向函数传送的是_____.
A.数组的长度B
10.函数的值通过return语句返回,下面关于return语句的形式描述错误的选项是_____.
A.return表达式;B.return(表达式);
C
11.设函数fun的定义形式为
voidfun(charch,floatx){…}
那么以下对函数fun的调用语句中,正确的选项是_____.
A.fun("abc",3.0);B.t=fun('D',16.5);C.fun('65',2.8);D.fun(32,32);
12.以下程序的输出结果是_____.
voidreverse(inta[],intn)
{inti,t;
for(i=0;i{t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;}
}
main()
{intb[10]={1,2,3,4,5,6,7,8,9,10};inti,s=0;
reverse(b,8);
for(i=6;i<10;i++)s+=b[i];
printf("%d\n",s);
}
A.22B.10
13.阅读以下程序,那么运行结果为_____.
fun()
{staticintx=5;
x++;
returnx;
}
main()
{inti,x;
for(i=0;i<3;i++)
x=fun();
printf("%d\n",x);
}
A.5B.6C.7D.8
14.假设使用一维数组名作函数实参,那么以下正确的说法是_____.
A.必须在主调函数中说明此数组的大小
C.在被调用函数中,不需要考虑形参数组的大小
15.在C语言中,定义函数时函数的类型可以缺省,此时函数的隐含类型是_____.
A.voidB.
16.在C语言中,形参的缺省存储类别是().
A
17.以下关于字符串的表达中正确的选项是_____.
D.空串一定比空格打头的字符串小
18.阅读程序,选择程序的运行结果。
#include
intTry(intn)
{
if(n>0)
return(n*Try(n-2));
else
return1;
}
voidmain()
{
intx;
x=Try(5);
printf(“%d\n〞,x);
}
A.15B.120C.1D.前面三个答案都是错的
(二)填空题
1.以下程序的运行结果是maxis2.
#include
max(intx,inty)
{intz;
z=(x>y)?
x:
y;
return(z);
}
main()
{inta=1,b=2,c;
c=max(a,b);
printf("maxis%d\n",c);
}
2.函数gongyu的作用是求整数num1和num2的最大公约数,并返回该值。
请填空。
gongyu(intnum1,intnum2)
{inttemp,a,b;
if(num1〔_____〕num2)
{temp=num1;num1=num2;num2=temp;}
a=num1;b=num2;
while(____)
{temp=a%b;a=b;b=temp;}
return(a);
}
3.以下程序的运行结果是A+B=9.
inta=5;intb=7;
main()
{inta=4,b=5,c;
c=plus(a,b);
printf("A+B=%d\n",c);
}
plus(intx,inty)
{intz;
z=x+y;
return(z);
}
4.以下程序的运行结果是_______.
main()
{incx();
incy();
incx();
incy();
incx();
incy();
}
incx()
{
intx=0;
printf("x=%d\t",++x);
}
incy()
{staticinty=0;
printf("\ny=%d\n",++y);
}
答案:
x=1
y=1
x=1
y=2
x=1
y=3
5.以下程序功能是求两个正整数的最大公约数。
#include
main()
{
intr,m,n,_____;
scanf("%d%d",&m,&n);
if(m________________
r=m%n;
while(r)
{m=n;
n=r;
r=____;
}
printf("%d\n",n);
}
指针
(一)选择题
1.假设有以下定义,那么对a数组元素的正确引用是_________.
inta[5],*p=a;
a)*&a[5]b)a+2c)*(p+5)d)*(a+2)
2.假设有定义:
inta[2][3],那么对a数组的第i行j列元素地址的正确引用为______.
a)*(a[i]+j)b)(a+i)c)*(a+j)d)a[i]+j
3.假设有以下定义,那么p+5表示_______.
inta[10],*p=a;
a)元素a[5]的地址b)元素a[5]的值
c)元素a[6]的地址d)元素a[6]的值
4.下面程序段的运行结果是_________.
char*s="abcde";
s+=2;printf("%d",s);
a)cdeb)字符'c'c)字符'c'的地址d)无确定的输出结果
5.设p1和p2是指向同一个字符串的指针变量,c为字符变量,那么以下不能正确
执行的赋值语句是________.
a)c=*p1+*p2;b)p2=cc)p1=p2d)c=*p1*(*p2);
6.以下正确的程序段是_________.
a)charstr[20];b)char*p;
scanf("%s",&str);scanf("%s",p);
c)charstr[20];d)charstr[20],*p=str;
scanf("%s",&str[2]);scanf("%s",p[2]);
7.假设有说明语句
chara[]="Itismine";
char*p="Itismine";
那么以下不正确的表达是________.
a)a+1表示的是字符t的地址
b)p指向另外的字符串时,字符串的长度不受限制
c)p变量中存放的地址值可以改变
d)a中只能存放10个字符
8.下面程序的运行结果是_______.
#include
#include
main()
{
char*s1="AbDeG";
char*s2="AbdEg";
s1+=2;s2+=2;
printf("%d\n",strcmp(s1,s2));
}
a)正数b)负数c)零d)不确定的值
9.下面程序的运行结果是_______.
#include
#include
fun(char*w,intn)
{chart,*s1,*s2;
s1=w;s2=w+n-1;
while(s1}
main()
{charp[]="1234567";//这里存在错误,通过字符指针无法改变字符串常量的值,因此改为数组
fun(p,strlen(p));
puts(p);
}
a)7654321b)1714171c)1711717d)7177171
10.变量的指针,其含义是指该变量的_________.
a)值b)地址
c)名d)一个标志
11.假设有语句int*point,a=4;和point=&a;下面均代表地址的一组选项是_____.
a)a,point,*&ab)&*a,&a,*point
c)*&point,*point,&ad)&a,&*point,point
12.假设有说明;int*p,m=5,n;以下正确的程序段的是________.
a)p=&n;b)p=&n;
scanf("%d",&p);scanf("%d",*p);
c)scanf("%d",&n);d)p=&n;
*p=n;*p=m;
13.假设有以下定义,那么对a数组元素的正确引用是_____.
inta[5],*p=a;
A.*&a[5]B.a+2C.*(p+2)D.*(a+5)
14.以下程序执行后的输出结果是_____.
main()
{inta[3][3],*p,i;
p=&a[0][0];
for(i=1;i<9;i++)p[i]=i+1;
printf("%d\n",a[1][2]);
}
A.3B.6
15.下面程序段的运行结果是_____.〔该题题目有错,而且考的内容偏了,是一题面试题〕
char*p="abcdefgh";
p+=3;
printf("%d\n",strlen(strcpy(p,"ABCD")));
A.8B.12C
(二)填空题
1.以下程序的功能是:
通过指针操作,找出三个整数中的最小值并输出。
请填空。
#include"stdlib.h"
main()
{int*a,*b,*c,num,x,y,z;
a=&x;b=&y;c=&z;
printf("输入3个整数:
");
scanf("%d%d%d",a,b,c);
printf("%d,%d,%d\n",*a,*b,*c);
num=*a;
if(*a>*b)num=*b;
if(num>*c)num=*c;
printf("输出最小整数:
%d\n",num);
}
2.下面程序段的运行结果是hELLO!
.
chars[80],*sp="HELLO!
";
sp=strcpy(s,sp);
s[0]='h';
puts(sp);
3.下面程序段的运行结果是ef.
charstr[]="abc\0def\0ghi",*p=str;
printf("%s",p+5);
4.下面程序的功能是将两个字符串s1和s2连接起来。
请填空。
#include
main()
{chars1[80],s2[80];
gets(s1);gets(s2);
conj(s1,s2);
puts(s1);
}
conj(char*p1,char*p2)
{char*p=p1;
while(*p1)p1++;
while(*p2){*p1=*p2;p1++;p2++;}
*p1='\0';
_return0_________;//可以省略不要
}
5.假设有定义:
inta[]={2,4,6,8,10,12},*p=a;那么*(p+1)的值是__4____.*(a+5)的值是__12_______.
6.假设有以下定义:
inta[2][3]={2,4,6,8,10,12};那么a[1][0]的值是__8___.*(*(a+1)+0))的值是___8___.
7.以下程序将数组a中的数据按逆序存放,请填空。
#defineM8
main()
{inta[M],i,j,t;
for(i=0;ii=0;j=M-1;
while(i{
t=*(a+i);*(a+i)=*(a+j);*(a+j)=t;
i++;j--;
}
for(i=0;i}
8.假设有定义:
inta[3][5],i,j;(且0<=i<3,0<=j<5),那么a数组中任一元素可用
五种形式引用。
它们是:
(1)a[i][j]
(2)*(a[i]+j)
(3)*(*(a+i)+j);
(4)(*(a+i))[j]
(5)*(a+5*i+j)
9.下面程序的运行结果是_________.
main()
{char*a[]={"Pascal","Clanguage","dBase","Coble"};
char(**p)[];
intj;
p=a+3;
for(j=3;j>=0;j--)printf("%s\n",*(p--));
}
答案:
Coble
dBase
Clanguage
Pascal
结构体
(一)选择题
1.C语言结构体类型变量在程序执行期间_________.
a)所有成员一直驻留在内存中
b)只有一个成员驻留在内存中
c)局部成员驻留在内存中
d)没有成员驻留在内存中
2.下面程序的运行结果是___________.
main()
{
structcmplx{intx;
inty;
}cnum[2]={1,3,2,7};
printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].x);
}
a)0b)1c)3d)6
3.设有如下定义:
structsk
{intn;
floatx;
}data,*p;
假设要使p指向data中的n域,正确的赋值语句是_______.
a)p=&data.n;
b)*p=data.n;
c)p=(structsk*)&data.n;
d)p=(structsk*)data.n;
4.以下对结构体变量stu1中成员age的非法引用是________.
structstudent
{intage;
intnum;
}stu1,*p;
p=&stu1;
a)stu1.ageb
c)p->aged)(*p).age
5.下面对typedef的表达中不正确的选项是______.
a)用typedef可以定义各种类型名,但不能用来定义变量
b)用typedef可以增加新类型
c)用typedef只是将已存在的类型用一个新的标识符来代表
d)使用typedef有利于程序的通用和移植
6.以下scanf函数调用语句中对结构体变量成员的不正确引用是________.
structpupil
{charname[20];
intage;
intsex;
}pup[5],*p;
p=pup;
a)scanf("%s",pup[0].name);
b)scanf("%d",&pup[0].age);
c)scanf("%d",&(p->sex));
d)scanf("%d",p->age);
(二)填空题
1.以下程序的运行结果是__10,x______.
structn{
intx;
charc;
};
main()
{structna={10,'x'};
func(a);
printf("%d,%c",a.x,a.c);
}
func(structnb)
{
b.x=20;
b.c='y';
}
2.假设有定义:
structnum
{inta;
intb;
floatf;
}n={1,3,5.0};
structnum*pn=&n;
那么表达式pn->b/n.a*++pn->b的值是___12_____,表达式(*pn).a+pn->f的值是
3.以下程序的运行结果是5,3.
structks
{inta;
int*b;
}s[4],*p;
main()
{
intn=1,i;
printf("\n");
for(i=0;i<4;i++)
{
s[i].a=n;
s[i].b=&s[i].a;
n=n+2;
}
p=&s[0];
p++;
printf("%d,%d\n",(++p)->a,(p++)->a);
}
4.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名
和年龄。
请在_______内填入正确内容。
statistructman{
charname[20];
intage;
}person[]={"li=ming",18,
"wang-hua",19,
"zhang-ping",20
};
main()
{structman*p,*q;
intold=0
p=person;
for(;pif(oldage)
{q=p;old=p->age;}
printf("%s%d",q->name,q->age);
}