C语言指针习题及答案.docx
《C语言指针习题及答案.docx》由会员分享,可在线阅读,更多相关《C语言指针习题及答案.docx(13页珍藏版)》请在冰点文库上搜索。
C语言指针习题及答案
指针主要内容得习题及答案
一.选择题
1、变量得指针,其含义就是指该变量得B。
A)值B)地址C)名D)一个标志
2、已有定义intk=2;int*ptr1,*ptr2;且ptr1与ptr2均已指向变量k,下面不能正确执行得赋值语句就是B。
A)k=*ptr1+*ptr2B)ptr2=kC)ptr1=ptr2D)k=*ptr1*(*ptr2)
3、若有说明:
int*p,m=5,n;以下程序段正确得就是D。
A)p=&n;B)p=&n;
scanf(“%d”,&p);scanf(“%d”,*p);
C)scanf(“%d”,&n);D)p=&n;
*p=n;*p=m;
4、已有变量定义与函数调用语句:
inta=25;print_value(&a);下面函数得输出结果就是D。
voidprint_value(int*x)
{printf(“%d\n”,++*x);}
A)23B)24C)25D)26
5、若有说明:
int*p1,*p2,m=5,n;以下均就是正确赋值语句得选项就是C。
A)p1=&m;p2=&p1;B)p1=&m;p2=&n;*p1=*p2;
C)p1=&m;p2=p1;D)p1=&m;*p1=*p2;
6、若有语句:
int*p,a=4;与p=&a;下面均代表地址得一组选项就是D。
A)a,p,*&aB)&*a,&a,*pC)*&p,*p,&aD)&a,&*p,p
7、下面判断正确得就是C。
A)char*a=”china”;等价于char*a;*a=”china”;
B)charstr[10]={“china”};等价于charstr[10];str[]={“china”;}
C)char*s=”china”;等价于char*s;s=”china”;
D)charc[4]=”abc”,d[4]=”abc”;等价于charc[4]=d[4]=”abc”;
8、下面程序段中,for循环得执行次数就是C。
char*s=”\ta\018bc”;
for(;*s!
=’\0’;s++)printf(“*”);
A)9B)7C)6D)5
9、下面能正确进行字符串赋值操作得就是C。
A)chars[5]={“ABCDE”};B)chars[5]={‘A’,’B’,’C’,’D’,’E’};
C)char*s;s=”ABCDE”;D)char*s;scanf(“%s”,s);
10、下面程序段得运行结果就是C。
char*s=”abcde”;
s+=2;printf(“%d”,s);
A)cdeB)字符’c’C)字符’c’得地址D)不确定
11、设p1与p2就是指向同一个字符串得指针变量,c为字符变量,则以下不能正确执行得赋值语句就是B。
A)c=*p1+*p2B)p2=cC)p1=p2D)c=*p1*(*p2)
12、设有程序段:
chars[]=”china”;char*p;p=s;则下面叙述正确得就是D。
A)s与p完全相同
B)数组s中得内容与指针变量p中得内容相等
C)s数组长度与p所指向得字符串长度相等
D)*p与s[0]相等
13、以下与库函数strcpy(char*p1,char*p2)功能不相等得程序段就是D。
A)strcpy1(char*p1,char*p2)
{while((*p1++=*p2++)!
=’\0’);}
B)strcpy2(char*p1,char*p2)
{while((*p1=*p2)!
=’\0’){p1++;p2++}}
C)strcpy3(char*p1,char*p2)
{while(*p1++=*p2++);}
D)strcpy4(char*p1,char*p2)
{while(*p2)*p1++=*p2++;}
14、下面程序段得运行结果就是C。
chara[]=”language”,*p;
p=a;
while(*p!
=’u’){printf(“%c”,*p-32);p++;}
A)LANGUAGEB)languageC)LANGD)langUAGE
16、以下与库函数strcmp(char*s,char*t)功能相等得程序段就是C。
A)strcmp1(char*s,char*t)
{for(;*s++=*t++;)
if(*s==’\0’)return0;
return(*s-*t);
}
B)strcmp2(char*s,char*t)
{for(;*s++=*t++;)
if(!
*s)return0;
return(*s-*t);
}
C)strcmp3(char*s,char*t)
{for(;*t==*s;)
{if(!
*t)return0;t++;s++;}
return(*s-*t);
}
D)strcmp4(char*s,char*t)
{for(;*s==*t;s++,t++)
if(!
*s)return0;
return(*t-*s);
}
17、以下说明不正确得就是D。
A)chara[10]=”china”;B)chara[10],*p=a;p=”china”;
C)char*a;a=”china”;D)chara[10],*p;p=a=”china”;
18、设有说明语句:
chara[]=”Itismine”;char*p=”Itismine”;则以下不正确得叙述就是D。
A)a+1表示得就是字符t得地址
B)p指向另外得字符串时,字符串得长度不受限制
C)p变量中存放得地址值可以改变
D)a中只能存放10个字符
19、若已定义chars[10];则在下面表达式中不表示s[1]得地址就是B。
A)s+1B)s++C)&s[0]+1D)&s[1]
20、若有定义:
inta[5],*p=a;则对a数组元素得正确引用就是D。
A)*&a[5]B)a+2C)*(p+5)D)*(a+2)
21、若有定义:
inta[5],*p=a;则对a数组元素地址得正确引用就是D。
A)p+5B)*a+1C)&a+1D)&a[0]
22、若有定义:
inta[2][3];则对a数组得第i行第j列元素值得正确引用就是A。
A)*(*(a+i)+j)B)(a+i)[j]C)*(a+i+j)D)*(a+i)+j
23、若有定义:
inta[2][3];则对a数组得第i行第j列元素地址得正确引用就是D。
A)*(a[i]+j)B)(a+i)C)*(a+j)D)a[i]+j
24、若有程序段:
inta[2][3],(*p)[3];p=a;则对a数组元素地址得正确引用就是。
A)*(p+2)B)p[2]C)p[1]+1D)(p+1)+2
25、若有程序段:
inta[2][3],(*p)[3];p=a;则对a数组元素得正确引用就是C。
A)(p+1)[0]B)*(*(p+2)+1)C)*(p[1]+1)D)p[1]+2
26、若有定义:
inta[5];则a数组中首元素得地址可以表示为C。
A)&aB)a+1C)aD)&a[1]
27、若有定义:
int(*p)[4];则标识符pC。
A)就是一个指向整型变量得指针
B)就是一个指针数组名
C)就是一个指针,它指向一个含有四个整型元素得一维数组
D)定义不合法
28、以下与int*q[5];等价得定义语句就是C。
A)intq[5]B)int*qC)int*(q[5])D)int(*q)[5]
29、以下正确得说明语句就是B。
A)int*b[]={1,3,5,7,9};
B)inta[5],*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
C)inta[]={1,3,5,7,9};int*num[5]={a[0],a[1],a[2],a[3],a[4]};
D)inta[3][4],(*num)[4];num[1]=&a[1][3];
30、若有定义:
intb[4][6],*p,*q[4];且0≤i<4,则不正确得赋值语句就是D。
A)q[i]=b[i];B)p=b;C)p=b[i];D)q[i]=&b[0][0]
32、若要对a进行自减运算,则a应有下面说明D。
A)intp[3];B)intk;C)char*a[3]D)intb[10];
int*a=p;int*a=&k;int*a=b+1;
33、以下选项中,对指针变量p得正确操作就是B。
A)inta[3],*p;B)inta[5],*p;C)inta[5];D)inta[5]
p=&a;p=a;int*p=a=100;int*p1,*p2=a;
*p1=*p2;
34、若有定义:
intx[10]={0,1,2,3,4,5,6,7,8,9},*p1;则数值不为3得表达式就是C。
A)x[3]B)p1=x+3,*p1++
C)p1=x+2,*(p1++)D)p1=x+2,*++p1
35、下面程序段得输出就是C。
inta[]={2,4,6,8,10,12,14,16,18,20,22,24},*q[4],k;
for(k=01;k<4;k++)q[k]=&a[k*3];
printf(“%d\n”,q[3][0]);
A)8B)16C)20D)输出不合法
36、若要对a进行自增运算,则a应具有下面说明D。
A)inta[3][2];B)char*a[]={“12”,”ab”};
C)char(*a)[3]D)intb[10],*a=b;
37、若有定义inta[4][6];则能正确表示a数组中任一元素a[i][j](i,j均在有效范围内)地址得表达式A。
A)&a[0][0]+6*i+jB)&a[0][0]+4*j+i
C)&a[0][0]+4*i+jD)&a[0][0]+6*j+I
38、下面程序得运行结果就是B。
main()
{intx[5]={2,4,6,8,10},*p,**pp;
p=x,pp=&p;
printf(“%d”,*(p++));
printf(“%3d”,**pp);
}
A)44B)24C)22D)46
39、若有定义intx[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};int(*p)[3]=x;则能够正确表示数组元素x[1][2]得表达式就是D。
A)*((*p+1)[2])B)(*p+1)+2
C)*(*(p+5))D)*(*(p+1)+2)
40、若有说明:
char*language[]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”};则language[2]得值就是B。
A)一个字符B)一个地址C)一个字符串D)一个不定值
41、设有定义:
char*cc[2]={“1234”,”5678”};则正确得叙述就是A。
A)cc数组得两个元素中各自存放了字符串”1234”与”5678”得首地址
B)cc数组得两个元素分别存放得就是含有4个字符得一维字符数组得首地址
C)cc就是指针变量,它指向含有两个数组元素得字符型一维数组
D)cc元素得值分别维”1234”与”5678”
42、已有定义int(*p)();指针p可以B。
A)代表函数得返回值B)指向函数得入口地址
C)表示函数得类型D)表示函数返回值得类型
43、已有函数max(a,b),为了让函数指针变量p指向函数max,正确得赋值方法就是A。
A)p=max;B)p=max(a,b);C)*p=max;D)*p=max(a,b);
44、若有函数max(a,b),并且已使函数指针变量p指向函数max,当调用该函数时,正确得调用方法就是C或p(a,b)。
A)(*p)max(a,b)B)*pmax(a,b);C)(*p)(a,b);D)*p(a,b);
45、以下正确得叙述就是C。
A)C语言允许main函数带形参,且形参个数与形参名均可由用户指定
B)C语言允许main函数带形参,形参名只能就是argc与argv
C)当main函数带有形参时,传给形参得值只能从命令行中得到
D)若有说明:
intmain(intargc,char**argv),则argc得值必须大于1
三.程序阅读题
1、写出下面程序得运行结果。
5
func(char*s,chara,intn)
{intj;
*s=a;j=n;
while(*s
returnj;
}
main()
{charc[6];
inti;
for(i=1;i<=5;i++)*(c+1)=’A’+i+1;
printf(“%d\n”,func(c,’E’,5));
}
2、写出下面程序得运行结果。
6
fun(char*s)
{char*p=s;
while(*p)p++;
return(p-s);
}
main()
{char*a=”abcdef”;
printf(“%d\n”,fun(a));
}
3、写出下面程序得运行结果。
abcdefglkjih
sub(char*a,intt1,intt2)
{charch;
while(t1ch=*(a+t1);*(a+t1)=*(a+t2);*(a+t2)=ch;
t1++;t2--;
}
}
main()
{chars[12];
inti;
for(i=0;i<12;i++)s[i]=’A’+i+32;
sub(s,7,11);
for(i=0;i<12;i++)printf(“%c”,s[i]);
printf(“\n”);
}
4、当运行以下程序时,写出输入6↙得程序运行结果。
976531
sub(char*a,charb)
{while(*(a++)!
=’\0’);
while(*(a-1)
*(a--)=*(a-1);
*(a--)=b;
}
main()
{chars[]=”97531”,c;
c=getchar();
sub(s,c);puts(s);
}
5、写出下面程序得运行结果。
Java
dBase
CLanguage
Pascal
main()
{char*a[]={“Pascal”,”CLanguage”,”dBase”,”Java”};
char(**p)[];intj;
p=a+3;
for(j=3;j>=0;j--)
printf(“%s\n”,*(p--));
}
四.程序填空题
1、下面函数得功能就是从输入得十个字符串中找出最长得那个串,请填
(2)空使程序完整。
voidfun(charstr[10][81],char**sp)
{inti;
*sp=【1str[0]】;
for(i=1;i<10;i++)
if(strlen(*sp)}
2、下面函数得功能就是将一个整数字符串转换为一个整数,例如:
”-1234”转换为1234,请填(3)空使程序完整。
intchnum(char*p)
{intnum=0,k,len,j;
len=strlen(p);
for(;【1*p!
=’\0’】;p++){
k=【2*p-‘0’】;j=(--len);
while(【3j--!
=0】)k=k*10;
num=num+k;
}
return(num);
}
3、下面函数得功能使统计子串substr在母串str中出现得次数,请填(3)空使程序完整。
intcount(char*str,char*substr)
{inti,j,k,num=0;
for(i=0;【1str[i]!
=’\0’】;i++)
for(【2j=i】,k=0;substr[k]==str[j];k++;j++)
if(substr[【3k】]==’\0’){
num++;break;
}
return(num);
}
6、下面函数得功能就是将两个字符串s1与s2连接起来,请填
(2)空使程序完整。
voidconj(char*s1,char*s2)
{
while(*s1)【1s1++】;
while(*s2){*s1=【2*s2】;s1++,s2++;}
*s1=’\0’;
}
五.编程题
1、定义3个整数及整数指针,仅用指针方法按由小到大得顺序输出。
2、输入10个整数,将其中最小得数与第一个数对换,把最大得数与最后一个数对换。
写三个函数:
①输入10个数;②进行处理;③输出10个数。
所有函数得参数均用指针。
3、编写一个求字符串得函数(参数用指针),在主函数中输入字符串,并输出其长度。
4、编写一个函数(参数用指针)将一个3×3矩阵转置。
5、写函数原型为intstrcmp(char*s1,char*s2);得函数,该函数实现两个字符串得比较(函数功能描述参见教材P137,strcmp字符串处理函数)。
6、利用指向行得指针变量求5×3数组各行元素之与。
教育之通病就是教用脑得人不用手,不教用手得人用脑,所以一无所能。
教育革命得对策就是手脑联盟,结果就是手与脑得力量都可以大到不可思议。
教育之通病就是教用脑得人不用手,不教用手得人用脑,所以一无所能。
教育革命得对策就是手脑联盟,结果就是手与脑得力量都可以大到不可思议。