程序设计期末.docx
《程序设计期末.docx》由会员分享,可在线阅读,更多相关《程序设计期末.docx(37页珍藏版)》请在冰点文库上搜索。
程序设计期末
第八章指针
1.若有语句int*point,a=4;和point=&a;下面均代表地址的一组选项是(D)
A)a,point,*&a
B)&*a,&a,*point
C)*&point,*point,&a
D)&a,&*point,point
2.以下程序的输出结果是(B)
#include
voidprt(int *x,int *y,int *z)
{printf("%d,%d,%d\n",++*x,++*y,*(z++));}
main()
{ inta=10,b=40,c=20;
prt(&a,&b,&c);
prt(&a,&b,&c);
}
A) 11,42,31
12,22,41
B) 11,41,20
12,42,20
C) 11,21,40
11,21,21
D) 11,41,21
12,42,22
3.有以下函数(C)
char*fun(char*p)
{returnp;}
该函数的返回值是
A)无确切的值 B)形参p中存放的地址值
C)一个临时存储单元的地址 D)形参p自身的地址值
4.若说明int*p,n;则通过语句scanf能够正确读入数据的程序段是(D)
A)p=&n;scanf("%d",&p); B)p=&n;scanf("%d",*p);
C)scanf("%d",n); D)p=&n;scanf("%d",p);
5.设有定义:
intn=0,*p=&n,**q=&p,则下列选项中正确的赋值语句是(D)
A)p=1;
B)*q=2;
C)q=p;
D)*p=5;
6.下列程序的输出结果是(B)
intb=2;
intfunc(int*a)
{ b+=*a;return(b);}
main()
{ inta=2,res=2;
res+=func(&a);
printf("%d\n",res);
}
A)4
B)6
C)8
D)10
7.执行以下程序后,a,b的值分别为(C)
main()
{ inta,b,k=4,m=6,*p1=&k,*p2=&m;
a=p1==&m;
b=(*p1)/(*p2)+7;
printf("a=%d\n",a);
printf("b=%d\n",b);
}
A)-1,5
B)1,6
C)0,7
D)4,10
8.以下程序有错,错误原因是(D)
main()
{int*p,i;char*q,ch;
p=&i;
q=&ch;
*p=40;
*p=*q;
......
}
A)p和q的类型不一致,不能执行*p=*q;语句
B)*p中存放的是地址值,因此不能执行*p=40;语句
C)q没有指向具体的存储单元,所以*q没有实际意义
D)q虽然指向了具体的存储单元,但该单元中没有确定的值,所以执行*p=*q;没有意义,可能会影响后面语句的执行结果
9.若有说明:
int*p,m=5,n;以下正确的程序段是(C)
A)p=&n;scanf("%d",&p);
B)p=&n;scanf("%d",*p)
C)scanf("%d",&n);*p=n;
D)p=&n;*p=m
10.有如下程序段(B)
int*p,a=10,b=1;
p=&a;a=*p+b;
执行该程序段后,a的值为
A)12
B)11
C)10
D)编译出错
11.以下程序执行后a的值是(C)
main()
{intx,y=252,i=386,*m=&y,*z=&i;
x=(z==y);
printf("%d",x);
}
A)252
B)1
C)0
D)运行时出错,x无定值
12.请选出正确的程序段(D)
A)int*p;
scanf("%d",p);
…
B)int*s,k;
*s=100;
…
C)int*s,k;
char*p,c;
s=&c;
p=&k;
*p=’a′;
…
D)int*s,k;
char*p,c;
s=&k;
p=&c;
s=p;
*s=1;
…
13.以下程序的运行结果是(B)
sub(intx,inty,int*z)
{*z=y-x;}
main()
{inta,b,c;
sub(10,5,&a);
sub(7,a,&b);
sub(a,b,&c);
printf("%4d,%4d,%4d\n",a,b,c);
}
A)5,2,3
B)-5,-12,-7
C)-5,-12,-17
D)5,-2,-7
14.已有变量定义和函数调用语句:
inta=25;print_value(&a);下面函数的正确输出结果是(D)
voidprint_value(int*x)
{printf("%d\n",++*x);}
A)23
B)24
C)25
D)26
15.下列程序的运行结果是(A)
voidfun(int*a,int*b)
{int*k;
k=a;a=b;b=k;
}
main()
{inta=2004,b=9,*x=&a,*y=&b;
fun(x,y);
printf("%d%d",a,b);
}
A)20049
B)92004
C)00
D)编译时出错
16.下面程序应能对两个整型变量的值进行交换。
以下正确的说法是(D)
main()
{inta=10,b=20;
printf("
(1)a=%d,b=%d\n",a,b);
swap(&a,&b);
printf("
(2)a=%d,b=%d\n",a,b);
}
swap(intp,intq)
{intt;
t=p;p=q;q=t;
}
A)该程序完全正确
B)该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可
C)该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可
D)以上说法都不对
17.已知inta;则下面的说明指针变量p的语句正确的是(C)
A)intp=&a B)int*p=a C)int*p=&a D)int*p=*a
18.已知char**t;则变量t是(C)
A)指向char变量的指针 B)指向指针的char变量
C)指向指针的指针 D)以上说法都不对
19.阅读下面程序,执行后的结果为(C)
#include"stdio.h"
voidfun(int*a,int*b)
{intk;
k=5;
*a=k;
*b=*a+k;
}
main()
{int*a,*b,x=10,y=15;
a=&x;
b=&y;
fun(a,b);
printf("%d,%d\n",*a,*b);
}
A)10,15 B)5,15 C)5,10 D)15,10
20.阅读下面程序,在程序执行后的结果为(A)
#include"stdio.h"
int*fun(int*a,int*b)
{intm;
m=*a;
m+=*b-3;
return(&m);}
main()
{intx=21,y=35,*a=&x,*b=&y;
int*k;
k=fun(a,b);
printf("%d\n",*k);}
A)53
B)21
C)35
D)14
21.变量的指针,其含义是指该变量的____(B)____.
a)值 b)地址 c)名 d)一个标志
22.若有语句int*point,a=4;和point=&a;下面均代表地址的一组选项是__(D)__.
a)a,point,*&ab)&*a,&a,*pointc)*&point,*point,&ad)&a,&*point,point
23.若有说明;int*p,m=5,n;以下正确的程序段的是___(D)____.
a)p=&n; b)p=&n; c)scanf("%d",&n); d)p=&n;
scanf("%d",&p); scanf("%d",*p); *p=n; *p=m;
24.下面程序段的运行结果是____(A)____.
char *s="abcde"; s+=2;printf("%s",s);
a)cde b)字符'c' c)字符'c'的地址 d)无确定的输出结果
25.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是____(B)___.
a)c=*p1+*p2; b)p2=c c)p1=p2 d)c=*p1*(*p2);
26.以下正确的程序段是____(B)_____.
a)char str[20]; scanf("%s",&str);
b)char *p scanf("%s",p);
c)char str[20];scanf("%s",&str[2]);
d)char str[20],*p=str; scanf("%s",p[2]);
27.若有说明语句
chara[]="Itismine"; char*p="Itismine";
则以下不正确的叙述是___(B)____.
a)a+1表示的是字符t的地址 b)p指向另外的字符串时,字符串的长度不受限制
c)p变量中存放的地址值可以改变 d)a中只能存放10个字符
28.下面程序的运行结果是___(B)___.
#include
#include
main()
{
char *s1="AbDeG";
char *s2="AbdEg";
s1+=2;s2+=2;
printf("%d\n",strcmp(s1,s2));
}
a)正数 b)负数 c)零 d)不确定的值
29.下面程序的运行结果是___(A)____.
#include
#include
fun(char *w,intn)
{char t,*s1,*s2;
s1=w;s2=w+n-1;
while(s1 }
main()
{char*p;
p="1234567";
fun(p,strlen(p));
puts(p);
}
a)7654321 b)1714171 c)1711717 d)7177171
30.若有以下定义,则对a数组元素的正确引用是____(D)____.
inta[5],*p=a;
a)*&a[5] b)a+2 c)*(p+5) d)*(a+2)
31.若有定义:
inta[2][3],
则对a数组的第i行j列元素地址的正确引用为__(D)___.
a)*(a[i]+j) b)(a+i) c)*(a+j) d)a[i]+j
32.若有以下定义,则p+5表示____(A)___.
int a[10],*p=a;
a)元素a[5]的地址 b)元素a[5]的值
c)元素a[6]的地址 d)元素a[6]的值
填空题:
1.引用一个数组元素,可以有两种方法:
下标法和 指针法 。
2.inta[3]={0,1,2},*p=a;printf("%d",*(++p))则输出结果是:
1 。
3.若有定义:
inta[3][5],i,j;(且0<=i<3,0<=j<5),则a数组中任一元素可用多种形式引用其中一种是:
(* (a+i) )[j]
4.char*p="House";则b[2]=’r’操作非法,字符串常量不能改变。
。
5.int(*p)(int,int)其中的p是 指向函数的指针变量 。
6.int(*p)[4]=,则p每加1,地址就增加 16 个字节。
7.一个变量的地址称为该变量的 指针 。
8.inta[3]={0,1,2},*p=a;printf("%d",*(p++))则输出结果是:
0 。
9.若有定义:
inta[3][5],i,j;(且0<=i<3,0<=j<5),则a数组中任一元素可用多种形式引用其中一种是:
*(*(a+i)+j _);
10.int(*p)[m]其中的p是 一个指向一个由整型数据组成的数组指针。
11.编译时为字符数组分配若干个存储单元,而对字符指针变量,只分配 1 个存储单元。
12.char *a【3】 ={"Zhang","Wang","Li"};
程序填空
1.以下程序的功能是:
通过指针操作,找出三个整数中的最小值并输出。
请填空。
#include "stdio.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______.
char s[80],*sp="HELLO!
";
sp=strcpy(s,sp);
s[0]='h';
puts(sp);
3.下面程序段的运行结果是_____ef___.
char str[]="abc\0def\0ghi",*p=str;
printf("%s",p+5);
4. 将若干字符串按字母顺序(由小到大)输出。
#include
#include
intmain()
{voidsort(char*name[],intn);
void print(char*name[],intn);
char *name[]={“Follow”,“Great”,“FORTRAN”,“Computer”};
int n=4;
sort(name,n);
return 0;
}
voidsort(char*name[],intn)
{char*temp; inti,j,k;
for (i=0;i { k=i;
for (j=i+1;j if(strcmp(name[k],name[j])>0)k=j;
if(k!
=i)
{temp=name[i];name[i]=name[k];
name[k]=temp;
}
}
}
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()
{int a[M],i,j,t;
for(i=0;i i=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[0][0]+5*i+j)
9.下面程序的运行结果是__ CobledBaseClanguagePascal_______.
main()
{char *a[]={"Pascal","Clanguage","dBase","Coble"};
char **p;
int j;
p=a+3;
for(j=3;j>=0;j--)printf("%s\n",*(p--));
}
10.下面的程序实现的是指针p所指向的地址的n个数中,求出最大的和最小的数据,请填空。
fun(int*p,intn)
{int*q;
intmax,min;
max=min=*p;
for(q=p;【3】;q++)
if(【4】)max=*q;
elseif(【5】)min=*q;
}
【3】q
【4】*q>max
【5】*q
第九章 结构体、共用体和用户定义类型
选择题
1.设有以下说明语句
typedefstruct
{ intn;
charch[8];
}PER;
则下面叙述中正确的是(B)
A)PER是结构体变量名
B)PER是结构体类型名
C)typedefstruct是结构体类型名
D)struct是结构体类型名
2.设有以下说明语句
structstu
{ inta;
floatb;
}stutype;
则下面的叙述不正确的是(C)
A)struct是结构体类型的关键字
B)structstu是用户定义的结构体类型
C)stutype是用户定义的结构体类型名
D)a和b都是结构体成员名
3.以下程序在VC环境下的运行结果是(D)
#include"stdio.h"
main()
{ structdate
{ intyear,month,day;}today;
printf("%d\n",sizeof(structdate));
}
A)6
B)8
C)10
D)12
4.若以下定义:
structlink
{ intdata;
structlink*next;
}a,b,c,*p,*q;
且变量a和b之间已有如下图所示的链表结构:
指针p指向变量a,q指向变量c。
则能够把c插入到a和b之间并形成新的链表的语句组是:
(D)
A)a.next=c;c.next=b;
B)p.next=q;q.next=p.next;
C)p->next=&c;q->next=p->next;
D)(*p).next=q;(*q).next=&b;
5.设有如下定义:
strucksk
{ inta;
floatb;
}data;
int*p;
若要使p指向data中的a域,正确的赋值语句是(C)
A)p=&a;
B)p=data.a;
C)p=&data.a;
D)*p=data.a;
6.以下对结构体类型变量的定义中,不正确的是(C)
A)typedefstructaa
{ intn;
floatm;
}AA;
AAtdl;
B)#defineAAstructaa
AA{intn;
floatm;
}tdl;
C)struct
{ intn;
floatm;
}aa;
structaatdl;
D)struct
{ intn;
floatm;
}tdl;
7.若有下面的说明和定义
structtest
{ intml;charm2;floatm3;
unionuu{charul[5];intu2[2];}ua;
}myaa;
则sizeof(structtest)的值是(D)
A)12
B)16
C)14
D)20
8.以下程序的输出是(C)
structst
{ intx;int*y;}*p;
intdt[4]={10,20,30,40};
structstaa[4]={50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0]};
main()
{ p=aa;
printf("%d\n",++(p->x));
}
A)10
B)11
C)51
D)60
9.下列各数据类型不属于构造类型的是(D)
A)枚举型
B)共用型
C)结构型
D)数组型
10.有以下程序:
#include
unionpw
{ inti;
charch[2];}a;
main()
{ a.ch[0]=13;a.ch[1]=0;printf("%d\n",a.i);}
程序的输出结果是(A)
A)13
B)14
C)208
D)209
11.设有以下说明语句
structex
{intx;floaty;charz;}example;
则下面的叙述中不正确的是(B)
A)struct结构体类型的关键字
B)example是结构体类型名
C)x,y,z都是结构体成员名
D)structex是结构体类型名
12.当说明一个结构体变量时系统分配给它的内存是(A)
A)各成员所需内存量的总和
B)结构中第一个成员所需内存量
C)成员中占内存量最大者所需的容量
D)结构中最后一个成员所需内存量
13.若有以下结构体,则正确的定义或引用的是(D)
structTest
{ intx;
inty;
}vl;
A)Test.x=