printf("%d\n",n);
}
该程序生成的可执行文件名为:
proc.exe。
若运行时输入命令行:
proc1234567
则程序的输出结果是______。
A、3B、5C、7D、11
解析:
本题考查的是带有参数的main函数。
main()可以带有参数,并且参数只能有两个,第一个参数(argc)类型为整型用来记下命令行的参数个数,第二个参数(argv)为一个字符型指针数组,其各个元素用来记下命令行各参数字符串的首地址。
此题执行时,argc的值为4,在循环中依次使用strlen()函数求出argv
(1)、argv
(2)、argv(3)指向的字符串(123、45、67)的长度并把他们加到变量n中,得到n的值为7。
故本题答案为C。
4.若有以下函数首部
intfun(doublex[10],int*n)
则下面针对此函数的函数声明语句中正确的是______。
A、intfun(doublex,int*n);B、intfun(double,int);
C、intfun(double*x,intn);D、intfun(double*,int*);
解析:
本题考查的是函数的声明。
函数声明可以照写已定义的函数的首部,再加一个分号就成为了对函数的声明,在函数声明中也可以不写形参名,而只写形参的类型,但要保证与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序相同。
字符数组可用指针来表示,所以选项D正确。
故本题答案为D。
5.有以下程序
main()
{chars[]={"aeiou"},*ps;
ps=s;printf("%c\n",*ps+4);}
程序运行后输出的结果是______。
A、aB、eC、uD、元素s[4]的地址
解析:
本题考查的是指针变量的运算。
此题中先定义一个指针变量ps,并将s的首地址赋给此指针变量,*ps+4相当于先从指针变量ps指向的地址中取出相应数据"a"后,对此数据加4,a的ASCII码为32,32+4=36,对应于字符e。
故本题答案选B。
6.有以下程序
voidchange(intk[]){k[0]=k[5];}
main()
{intx[10]={1,2,3,4,5,6,7,8,9,10},n=0;
while(n<=4)
{change(&x[n]);n++;}
for(n=0;n<5;n++)printf("%d",x[n]);
printf("\n");}
程序运行后输出的结果是______。
A、678910B、13579C、12345D、62345
解析:
本题考查的是数组名作函数参数。
当n=0时,把x[0]的地址传给被调函数change,即将形参k与实参x指向同一个存储单元x[0],执行被调函数后,k[0]=6,即x[0]=6;当n=1时,形参k指向x数组的第1个数组元素所在单元,即k[0]与x[1]共用同一存储单元,执行被调函数后,k[0]=7,即x[1]=7,依次类推得出x[0]到x[4]的值分别为6、7、8、9、10。
故本题答案为A。
7.有以下程序
intadd(inta,int{return(a+b);}
main()
{intk,(*f)(),a=5,b=10;
f=add;…}
则以下函数调用语句错误的是______。
A、k=(*f)(a,b);B、k=add(a,b);C、k=*f(a,b);D、k=f(a,b);
解析:
此题定义了指向函数的指针变量f指向了函数add的入口地址,所以,要调用函数,可以通过函数名(选项B的形式)或函数指针变量(选项A、D的形式)调用即可,而选项C中是先进行函数调用,然后对调用后返回的整型值求其指针值,是不合理的。
故本题答案为C。
8.有以下程序
main()
{inta=1,b=3,c=5;
int*p1=&a,*p2=&b,*p=&c;
*p=*p1*(*p2);
printf("%d\n",c);}
执行后的输出结果是______。
A、1B、2C、3D、4
解析:
本题考查的是通过指针引用数据进行计算。
p1=&a表示指针变量p1指向元素1的地址;p2=&b表示指针变量p2指向元素3的地址;p=&c表示指针变量p指向元素5的地址;执行*p=*p1*(*p2)=1*3=3,所以最后的结果为:
3。
故本题答案为C。
9.在16位编译系统上,若有定义inta[]={10,20,30},*p=&a;,少逗号当执行p++;后,下列说法错误的是______。
A、p向高地址移了一个字节B、p向高地址移了一个存储单元
C、p向高地址移了两个字节D、p与a+1等价
解析:
本题考查的是指针的应用。
题目中p=&a表示指针p指向第一个元素a[0],执行p++是指使p指向下一个数据对象的地址,也就是向高地址移了一个存储单元;因为int数据占两个字节,所以p相当于向高地址移了两个字节,所以选项A错误。
故本题答案为A。
10.有以下程序
voidswap(char*x,char*y)
{chart;
t=*x;*x=*y;*y=t;}
main()
{char*s1="abc",*s2="123";
swap(s1,s2);printf("%s,%s\n",s1,s2);}
程序执行后的输出结果是______。
A、123,abcB、abc,123C、1bc,a23D、321,cba
解析:
本题考查的是指针变量值的交换。
C语言中,字符串常量在内存中是以字符数组的形式进行存放的,因此字符指针x和y指向的是各字符串的首地址,也就是字符串第一个字符的地址,则*x与*y交换的是字符串的第一个字符,即字符"a"与"1"的交换,而字符串中其它字符保持不变。
故本题答案为C。
11.有以下程序
voidfun1(char*p)
{char*q;
q=p;
while(*q!
='\0')
{(*q)++;q++;}}
main()
{chara[]={"Program"},*p;
p=&a[3];fun1(p);printf("%s\n",a);}
程序执行后的输出结果是______。
A、ProhsbnB、PrphsbnC、ProgsbnD、Program
解析:
本题考查的是指向数组的指针作为函数的参数及指针的运算。
如果形参数组中的元素发生变化,实参也将发生相应变化。
指针p指向数组的第三位地址(即字符"g"的地址),q=p也就相当于指针q指向数组的第三位地址。
表达式(*q)++,首先根据()的优先级得到a[3]的值"g",再进行加1运算,所以g也就变成了h;表达式q++是将地址加1,也就是指向下一个地址a[4]。
然后再执行while()语句,直到遇到'\0'结束循环,返回形参。
故本题答案为A。
12.有以下程序
main()
{char*p[]={"3697","2548"};
inti,j;longnum=0;
for(i=0;i<2;i++)
{j=0;
while(p[i][j]!
='\0')
{if((p[i][j]-'0')%2)num=10*num+p[i][j]-'0';
j+=2;}}
printf("%d\n",num);}
程序执行后的输出结果上______。
A、35B、37C、39D、3975
解析:
本题考查的是指针数组。
题目中定义的指针数组"*p[]"相当于一个两行四列的数组。
执行for()语句i=0,j=0,p[i][j]=p[0][0]=3,满足while循环条件,执行循环体中的if语句得num=3,j=2,此时p[i][j]=p[0][2]=9,满足循环条件,执行while循环体得num=39,j=4,判断while条件且不符合并退出while循环;再次执行for()语句i=1,j=0,p[i][j]=p[1][0]=2,满足while条件,执行循环体中的if语句,但不符合if条件,所以num不进行运算,j进行加2运算j=2,此时p[i][j]=p[1][2]=4,if条件还是为假,num不进行运算,j进行加2运算j=4,再执行while语句,条件不符合退出循环。
所以结果为39。
故本题答案为C。
13.设有定义:
intn1=0,n2,*p=&n2,*q=&n1;,以下赋值语句中与n2=n1;语句等价的是______。
A、*p=*q;B、p=q;C、*p=&n1;D、p=*q;
解析:
本题考查的是指针变量的赋值。
本题答案为A。
14.有以下程序
voidsum(inta[])
{a[0]=a[-1]+a[1];}
main()
{inta[10]={1,2,3,4,5,6,7,8,9,10};
sum(&a[2]);
printf("%d\n",a[2]);}
程序运行后的输出结果是______。
A、6B、7C、5D、8
解析:
本题考查的是函数参数的传递。
本题答案为A。
15.有以下程序
main()
{inta[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],*q=p+2;
printf("%d\n",*p+*q);}
程序运行后的输出结果是______。
A、16B、10C、8D、6
解析:
本题考查的是指向数组的指针变量。
数组a各元素a[0]~a[9]的值依次为1~10;在程序的说明部分,指针变量p初始化为&a[3],即*p的值为4;指针变量q初始化为p+2,即&a[3]+2,所以*q的值为6,所以*p+*q的值为10。
故本题答案为B。
16.有以下程序,其中函数f的功能是将多个字符串按字典顺序排序
#include
voidf(char*p[],intn)
{char*t;inti,j;
for(i=0;ifor(j=i+1;jif(strcmp(p[i],p[j])>0){t=p[i];p[i]=p[j];p[j]=t;}}
main()
{char*p[5]={"abc","aabdfg","abbd","dcdbe","cd"};
f(p,5);
printf("%d\n",strlen(p[1]));}
程序运行后的输出结果是______。
A、2B、3C、6D、4
解析:
本题经过排序后,得到第二个字符串是"abbd",所以输出结果是4。
故本题答案为D。
17.有以下程序
#include
voidf(char*s,char*t)
{chark;
k=*s;*s=*t;*t=k;s++;t--;
if(*s)f(s,t);}
main()
{charstr[10]="abcdefg",*p;
p=str+strlen(str)/2+1;
f(p,p-2);
printf("%s\n",str);}
程序运行后的输出结果是______。
A、abcdefgB、gfedcbaC、gbcdefaD、abedcfg
解析:
本程序的作是将字符串str倒序。
故本题答案为B。
18.有以下程序
voidswap1(intc0[],intc1[])
{intt;
t=c0[0];c0[0]=c1[0];c1[0]=t;}
voidswap2(int*c0,int*c1)
{intt;
t=*c0;*c0=*c1;*c1=t;}
main()
{inta[2]={3,5},b[2]={3,5};
swap1(a,a+1);swap2(&b[0],&b[1]);
printf("%d%d%d%d\n",a[0],a[1],b[0],b[1]);}
程序运行后的输出结果是______。
A、3553B、5335C、3535D、5353
解析:
函数swap1、swap2的作用均为交换两个数。
主调函数"swap1(a,a+1)"使得数组a的首地址赋给形参c0[],使得c0指向a[0]所在的存储单元,a[1]的地址赋给形参c1[],使得c1指向a[1]所在的存储单元,故交换c0[0]与c1[0]后,a[0]与a[1]值也发生了变化;主调函数"swap2(&b[0],&b[1]);"起着同样的作用,使得指针变量c0指向了b[0]存储单元,c1指向了b[1]存储单元,并在swap2函数中发生了交换,所以b[0]、b[1]的值也发生变化,故本程序输出的结果是5353。
故本题答案为D。
19.有以下程序
main()
{
inta[3][2]={0},(*ptr)[2],i,j;
for(i=0;i<2;i++){ptr=a+i;scanf("%d",ptr);ptr++;}
for(i=0;i<3;i++)
{for(j=0;j<2;j++)printf("%2d",a[i][j]);
printf("\n");}}
若运行时输入:
123<回车>,则输出结果是______。
A、产生错误信息B、10C、12D、10
203020
000030
解析:
本题定义了一个二维数组a,又定义了一个指针变量ptr,它用于指向包含2个元素的一维数组,在第一个for循环中,语句"ptr=a+i;"用于将指针变量ptr指向第i行的数组元素,通过两次循环,分别给二维数组a的第0行的第1个元素和第1行的第1个元素赋了值1和2。
故本题答案为B。
20.有以下程序
point(char*p){p+=3;}
main()
{charb[4]={'a','b','c','d'},*p=b;
point(p);
printf("%c\n",*p);}
程序运行后的输出结果是______。
A、aB、bC、cD、d
解析:
本题考查的是指针变量对数组的引用。
本题答案为A。
21.若有以下说明和语句
intc[4][5],(*p)[5];p=c;
能够正确引用c数组元素的是______。
A、p+1B、*(p+3)C、*(p+1)+3D、*(p[0]+2)
解析:
本题考查的是数组元素的引用。
本题答案为D。
22.有以下程序
#include
main()
{inta[]={1,2,3,4,5,6,7,8,9,10,11,12,},*p=a+5,*q=NULL;
*q=*(p+5);
printf("%d%d\n",*p,*q);}
程序运行后的输出结果是______。
A、运行后报错B、66C、611D、510
解析:
此题考查的是指针变量赋值。
本题将指针q赋值为空,即指向了空地址,而对空地址所对应的内容赋值*q=*(p+5)是会出错的,所以输出结果会报错。
所以此题答案为A。
23.有以下程序
main()
{inta=7,b=8,*p,*q,*r;
p=&a;q=&b;
r=p;p=q;q=r;
printf("%d,%d,%d,%d\n",*p,*q,a,b);}
程序运行后的输出结果是______。
A、8,7,8,7B、7,8,7,8C、8,7,7,8D、7,8,8,7
解析:
此题考的是指针变量。
本题答案为C。
24.有以下程序
main()
{charstr[][10]={"China","Beijing"},*p=str;
printf("%s\n",p+10);}
程序运行后的输出结果是______。
A、ChinaB、BejingC、ngD、ing
解析:
此题考的是指向数组元素的指针变量。
p+10就指向了从首地址依次向后的第11个存储单元即字符B的地址,所以输出Beijing,故答案为B。
25.设有如下的程序段
charstr[]="Hello";
char*ptr;ptr=str;
执行完上面的程序段后,*(ptr+5)的值为______。
A、'o'B、'\0'C、不确定的值D、'o'的地址
解析:
本题的考查点是字符数组的结束标志。
故本题答案为B。
26.若已定义:
inta[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是______。
A、p+1B、a+1C、a++D、++p
解析:
本题的考查点是数组地址的表示。
选项C中,数组名所表示的数组地址不能被重新赋值。
故本题答案为C。
27.已定义以下函数
fun(char*p2,char*p1)
{while((*p2=*p1)!
='\0'){p1++;p2++;}}
函数的功能是______。
A、将p1所指字符串复制到p2所指内存空间B、将p1所指字符串的地址赋给指针p2
C、对p1和p2两个指针所指字符串进行比较
D、检查p1和p2两个指针所指字符串中是否有'\0'
解析:
while((*p2=*p1)!
='\0'表示将p1所指向的值赋给*p2,即将p1所指字符串复制到p2所指内存空间。
在这里“*P2=*p1”是赋值操作,而不是比较是否相等,比较应当为双等号“==”。
所以B,C,D都不对。
故本题答案为A。
28.若有定义:
int*p[3];,则以下叙述中正确的是______。
A、定义了一个基类型为int的指针变量p,该变量具有三个指针
B、定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针
C、定义了一个名为*p的整型数组,该数组含有三个int类型元素
D、定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素
解析:
int*p[3]表示此数组是指针类型的,每个数组元素(指针变量)都可指向一个整型的指针变量。
故本题答案选B。
29.设有定义:
inta,*pa=&a;以下scanf语句中能正确为变量a读入数据的是___。
A、scanf("%d",pa);B、scanf("%d",a);
C、scanf("%d",&pa);D、scanf("%d",*pa);
解析:
scanf函数可以用来输入任何类型的多个数据。
本题答案为A。
30.有以下程序
main()
{charch[]="uvwxyz",*pc;
pc=ch;printf("%c\n",*(pc+5));}
程序运行后的输出结果是______。
A、zB、0C、元素ch[5]的地址D、字符y的地址
解析:
本题中定义了一个字符串数组和指针,并将指针pc指向该数组的首地址,语句中的*(pc+5)指的就是pc[5]的值,所以最后输出的结果为z。
故本题答案选A。
31.有以下函数
intfun(char*s)
{char*t=s;
while(*t++);
return(t-s);}
该函数的功能是______。
A、比较两个字符串的大小B、计算s所指字符串占用内存字节的个数
C、计算s所指字符串的长度D、将s所指字符串复制到字符串t中
解析:
本题考查的是通过字符指针进行字符长度的计算。
故本题答案选C。
32.若有定义:
char*x="abcdefghi";以下选项中正确运用了strcpy函数的是____。
A、chary[10];strcpy(y,x[4]);B、chary[10];strcpy(++y,&x[1]);
C、chary[10],*s;strcpy(s=y+5,x);D、chary[10],*s;strcpy(s=y+1,x+1);
解析:
本题考查的是用于字符串处理的函数strcpy。
本题答案为D。
33.设有以下定义和语句
charstr[20]="Program",*p;p=str;
则以下叙述中正确的是______。
A、*P与str[0]中的值相等B、str与p的类型完全相同
C、str数组长度和p所指向的字符串长度相等
D、数组str中存放的内容和指针变量p中存放的内容相同
解析:
本题考查的是指针变量对数组的引用。
本题答案为A。
34.以下语句或语句组中,能正确进行字符串赋值的是______。
A、char*sp;*sp="right!
";B、chars[10];s="right!
";
C、chars[10];*s="right!
";D、char*sp="right!
";