第10章指针
同步练习一
一、选择题(在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项填涂在答题卡相应位置上。)10.1若有下面的程序段:
chars[]="china";char*p;p=s;
则下列叙述正确的是
A)s和p完全相同落千丈
B)数组s中的内容和指针变量p中的内容相等
C)s数组长度和p所指向的字符串长度相等
D)*p与s[0]相等
考生答案:正确答案:D
10.2若有语句int*point,a=4;和point=&a;下面均代表地址的一组选项是
A)a,point,*&a
B)&*a,&a,*point
C)*&point,*point,&a
D)&a,&*point,point
考生答案:正确答案:D
10.3下列程序执行后的输出结果是
voidfunc(int*a,intb[])
{b[0]=*a+6;}
main()
{inta,b[5];
a=0;b[0]=3;
func(&a,b);printf("%d\n",b[0]);
}
A)6
B)7
C)8
D)9
考生答案:正确答案:A
10.4已定义以下函数
fun(char*p2,char*p1)
{while((*p2=*p1)!=’\0’){p1++;p2++;}
}
函数的功能是
A)将p1所指字符串复制到p2所指内存空间
B)将p1所指字符串的地址赋给指针p2
C)对p1和p2两个指针所指字符串进行比较
D)检查p1和p2两个指针所指字符串中是否有’\0’
考生答案:正确答案:A
10.5有以下程序
voidss(char*s,chart)
{while(*s)
{if(*s==t)*s=t-’a’+’A’;
s++;
}
}
main()
{charstr1[100]="abcddfefdbd",c=’d’;
ss(str1,c);
printf("%s\n",str1);
}
程序运行后的输出结果是
A)ABCDDEFEDBD
B)abcDDfefDbD
C)abcAAfefAbA
D)Abcddfefdbd
考生答案:正确答案:B
10.6下面说明不正确的是
A)chara[10]="china";
B)chara[10],*p=a;p="china"
C)char*a;a="china";
D)chara[10],*p;p=a="china"
考生答案:正确答案:D
10.7设有定义:intn=0,*p=&n,**q=&p,则下列选项中正确的赋值语句是
A)p=1;
B)*q=2;
C)q=p;
D)*p=5;
考生答案:正确答案:D
10.8执行以下程序后,a,b的值分别为
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
考生答案:正确答案:C
10.9假定以下程序经编译和连接后生成可执行文件PROG.EXE,如果在此可执行文件所在目录的DOS提示符下键入:
PROGABCDEFGHIJKL,则输出结果为
main(intargc,char*argv[])
{while(--argc>0)
printf("%s",argv[argc]);
printf("\n");
}
A)ABCDEFG
B)IJHL
C)ABCDEFGHIJKL
D)IJKLABCDEFGH
考生答案:正确答案:D
10.10以下程序有错,错误原因是
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;没有意义,可能会影响后面语句的执行结果
考生答案:正确答案:D来源:-计算机二级考试
10.11下面程序段的运行结果是
chara[]="lanuage",*p;
p=a;
while(*p!=′u′){printf("%c",*p-32);p++;}
A)LANGUAGE
B)language
C)LAN
D)langUAGE
考生答案:正确答案:C
10.12有以下语句,则对a数组元素的引用不正确的是(0≤i≤9)
inta[10]={0,1,2,3,4,5,6,7,8,9},*p=a;
A)a[p-a]
B)*(&a[i])
C)p[i]
D)*(*(a+i))
考生答案:正确答案:D
10.13函数fun的返回值是
fun(char*a,char*b)
{intnum=0,n=0;
while(*(a+num)!=′\0′)num++;
while(b[n]){*(a+num)=b[n];num++;n++;}
returnnum;
}
A)字符串a的长度
B)字符串b的长度
C)字符串a和b的长度之差
D)字符串a和b的长度之和
考生答案:正确答案:D
10.14下列程序的输出结果是
main()
{inta[5]={2,4,6,8,10},*p,**k;
p=a;
k=&p;
printf("%d",*(p++));
printf("%d\n",**k);
}
A)4
B)22
C)24
D)46
考生答案:正确答案:C
10.15下面判断正确的是
A)char*a="china";等价于char*a;*a="china";
B)charstr[5]={"china"};等价于charstr[]={"china"};
C)char*s="china";等价于char*s;s="china";
D)charc[4]="abc",d[4]="abc";等价于charc[4]=d[4]="abc";
考生答案:正确答案:C
10.16以下定义中,标识符prtint(*prt)[3]
A)定义不含法
B)是一个指针数组名,每个元素都是一个指向整数变量的指针
C)是一个指针,它指向一个具有三个元素的一维数组
D)是一个指向整型变量的指针
考生答案:正确答案:D
10.17有如下说明
inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
则数值为9的表达式是
A)*p+9
B)*(p+8)
C)*p+=9
D)p+8
考生答案:正确答案:B
10.18若有定义:char*st="howareyou";下列程序段中正确的是
A)chara[11],*p;strcpy(p=a+1,&st[4]);
B)chara[11];strcpy(++a,st);
C)chara[11];strcpy(a,st);
D)chara[],*p;strcpy(p=&a[1],st+2);
考生答案:正确答案:A
10.19下列程序的运行结果是
voidfun(int*a,int*b)
{int*k;
k=a;a=b;b=k;
}
main()
{inta=3,b=6,*x=&a,*y=&b;
fun(x,y);
printf("%d%d",a,b);
}
A)63
B)36
C)编译出错
D)00
考生答案:正确答案:B来源:-计算机二级考试
10.20若有说明语句
chara[]="Itismine";
char*p="Itismine";
则以下不正确的叙述是
A)a+1表示的是字符t的地址
B)p指向另外的字符串时,字符串的长度不受限制
C)p变量中存放的地址值可以改变
D)a中只能存放10个字符
考生答案:正确答案:D
10.21以下程序的运行结果是
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("M,M,M\n",a,b,c);
}
A)5,2,3
B)-5,-12,-7
C)-5,-12,-17
D)5,-2,-7
考生答案:正确答案:B
10.22若有下面的程序片段:
int[12]={0},*p[3],**pp,i;
for(i=0;i<3;i)
p[i]=&a[i*4];
pp=p;
则对数组元素的错误引用是
A)pp[0][1]
B)a[10]
C)p[3][1]
D)*(*(p+2)+2)
考生答案:正确答案:C
10.23下面程序的输出结果是
#include#includemain()
{char*p1="abc",*p2="ABC",str[50]="xyz";
strcpy(str+2,strcat(p1,p2));
printf("%s\n",str);
}
A)xyzabcABC
B)zabcABC
C)xyabcABC
D)yzabcABC
考生答案:正确答案:C
10.24有如下程序
main()
{charch[2][5]={"6937","8254"},*p[2];
inti,j,s=0;
for(i=0;i<2;i++)
p[i]=ch[i];
for(i=0;i<2;i++)
for(j=0;p[i][j]>′\0′;j+=2)
s=10*s+p[i][j]-′0′;
printf("%d\n",s);
}
该程序的输出结果是
A)69825
B)63825
C)6385
D)693825
考生答案:正确答案:C
10.25阅读下面程序,则执行后的结果为
#include"stdio.h"
#include"string.h"
#defineN10
#defineM10
char*find(char(*a)[M],intn)
{char*q;inti;
q=a[0];
for(i=0;i
if(strcmp(a[i],q)<0)
q=a[i];
returnq;
}
main()
{chars[N][M]={"tomeetme","you","and","he","china"};
char*p;
intn=5,i;
p=find(s,n);
puts(p);
}
A)heB)andC)youD)tomeetme
考生答案:正确答案:B来源:-计算机二级考试 二、填空题(请将每一个空的正确答案写在答题卡相应序号后。)10.26函数voidfun(float*sn,intn)的功能是:根据以下公式计算S,计算结果通过形参指针sn传回;n通过形参传入,n的值大于等于0。请填空。
voidfun(float*sn,intn)
{floats=0.0,w,f=-1.0;
inti=0;
for(i=0;i<=n;i++)
{f=【1】*f;
w=f/(2*i+1);
s+=w;
}
【2】=s;
}
考生答案:正确答案:-1正确答案:*sn
10.27该程序运行的结果是【3】。
#include#include#defineM100
voidfun(intm,int*a,int*n)
{inti,j=0;
for(i=1;i<=m;i++)
if(i%7==0||i==0)
a[j++]=i;
*n=j;
}
main()
{intaa[M],n,k;
clrscr();
fun(10,aa,&n);
for(k=0;k
if((k+1) ==0)
printf("\n");
elseprintf("M",aa[k]);
printf("\n");
}
考生答案:正确答案:7
10.28下列程序的功能是:求出ss所指字符串中指定字符的个数,并返回此值。
例如,若输入字符串123412132,输入字符1,则输出3,请填空。
#include#include#defineM81
intfun(char*ss,charc)
{inti=0;
for(;【4】;ss++)
if(*ss==c)i++;
returni;
}
main()
{chara[M],ch;
clrscr();
printf("\nPleaseenterastring:");gets(a);
printf("\nPleaseenterachar:");ch=getchar();
printf("\nThenumberofthecharis:%d\n",fun(a,ch));
}
考生答案:正确答案:*ss!=’\0’
10.29若给fun函数的形参s传送字符串:“]]6354abcc”(其中]表示空格字符),则函数的返回值是【5】。
#includelongfun(chars[])
{longn;intsign;
for(;isspace(*s);s++);
sign=(*s==′-′)?-1:1;
if(*s==′+′||*s==′-′)s++;
for(n=0;isdigit(*s);s++)n=10*n+(*s-′0′);
returnsign*n;
}
考生答案:正确答案:6354
10.30下面程序是指从终端读入的20个字符放入字符数组中,然后利用指针变量输出上述字符串,请填空。
#includemain()
{inti;chars[21],*p;
for(i=0;i<20;i++)
s[i]=getchar();
s[i]=【6】;
p=【7】
while(*p)putchar(【8】);
}
正确答案:’\0’正确答案:s正确答案:*p++
10.31以下函数的功能是求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。
例如,若x中的值为30,则有4个数符合要求,它们是1,3,5,15。
请按题意,完成填空。
试题程序:
#include#includevoidfun(intx,intpp[],int*n)
{inti,j=0;
【9】
if(x%i==0)pp[j++]=i;
【10】;
}
main()
{intx,aa[1000],n,i;
clrscr();
printf("\nPleaseenteranintegernumber:\n");
scanf("%d",&x);
fun(x,aa,&n);
for(i=0;i
printf("%d",aa[i]);
printf("\n");
}
正确答案:for(i=1;i
10.32mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回。请填空。
intmystrlen(char*str)
{inti;
for(i=0;【11】!=′\0′;i++);
return(i);
}
考生答案:正确答案:*(str+i)或str[i]
10.33下面函数的功能是:找出一维数组元素中最大的值和它所在的下标,最大值的和它所在的下标通过形参传回。数组元素中的值已在主函数中赋予。主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。请填空。
#include#includevoidfun(inta[],intn,int*max,int*d)
{inti;
*max=a[0];
*d=0;
for(i=0;【12】;i++)
if(*max
{*max=a[i];*d=i;}
}
main()
{inti,x[20],max,index,n=10;
randomize();
for(i=0;i
{x[i]=rand()P;printf("M",x[i]);
}
printf("\n");
fun(x,n,&max,&index);
printf("Max=],Index=M\n",max,index);
}
考生答案:正确答案:i
10.34阅读以下程序,使程序输出结果为30,4.000000,请填空。
#include"stdio.h"
main()
{inta=30,b=40,c;
double【14】,s;
s=fun(&a,&b,&c);
printf("%d,%lf\n",c,s);}
doublefun(int*a,int*b,【15】)
{*c=*a%*b;
return(4.0);
}
正确答案:fun(int*,int*,int*)正确答案:int*c