C语言习题十指针Word文档格式.docx
《C语言习题十指针Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言习题十指针Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
n代表的是变量n的地址,将一个地址赋给一个值是不正确的,所以选项B错误;
指针p代表存储单元的地址,前面不需要再加&
,所以选项C错误;
选项D是将一个地址进行输出,所以也是错误的。
除了给指针变量赋地址值外,还可以给指针变量赋NULL值,选项A正确。
故本题答案选A。
3.有以下程序
string.h>
main(intargc,char*argv[])
{inti=1,n=0;
while(i<
argc){n=n+strlen(argv[i]);
i++;
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.有以下程序
{chars[]={"
aeiou"
},*ps;
ps=s;
%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];
{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<
n++)printf("
x[n]);
\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.有以下程序
{inta=1,b=3,c=5;
int*p1=&
a,*p2=&
b,*p=&
c;
*p=*p1*(*p2);
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。
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错误。
10.有以下程序
voidswap(char*x,char*y)
{chart;
t=*x;
*x=*y;
*y=t;
{char*s1="
abc"
*s2="
123"
;
swap(s1,s2);
%s,%s\n"
s1,s2);
程序执行后的输出结果是______。
A、123,abcB、abc,123C、1bc,a23D、321,cba
本题考查的是指针变量值的交换。
C语言中,字符串常量在内存中是以字符数组的形式进行存放的,因此字符指针x和y指向的是各字符串的首地址,也就是字符串第一个字符的地址,则*x与*y交换的是字符串的第一个字符,即字符"
与"
1"
的交换,而字符串中其它字符保持不变。
11.有以下程序
voidfun1(char*p)
{char*q;
q=p;
while(*q!
='
\0'
)
{(*q)++;
q++;
}}
{chara[]={"
Program"
},*p;
p=&
a[3];
fun1(p);
%s\n"
a);
A、ProhsbnB、PrphsbnC、ProgsbnD、Program
本题考查的是指向数组的指针作为函数的参数及指针的运算。
如果形参数组中的元素发生变化,实参也将发生相应变化。
指针p指向数组的第三位地址(即字符"
g"
的地址),q=p也就相当于指针q指向数组的第三位地址。
表达式(*q)++,首先根据()的优先级得到a[3]的值"
,再进行加1运算,所以g也就变成了h;
表达式q++是将地址加1,也就是指向下一个地址a[4]。
然后再执行while()语句,直到遇到'
结束循环,返回形参。
故本题答案为A。
12.有以下程序
{char*p[]={"
3697"
"
2548"
};
inti,j;
longnum=0;
2;
i++)
{j=0;
while(p[i][j]!
{if((p[i][j]-'
0'
)%2)num=10*num+p[i][j]-'
j+=2;
}}
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。
13.设有定义:
intn1=0,n2,*p=&
n2,*q=&
n1;
,以下赋值语句中与n2=n1;
语句等价的是______。
A、*p=*q;
B、p=q;
C、*p=&
D、p=*q;
本题考查的是指针变量的赋值。
本题答案为A。
14.有以下程序
voidsum(inta[])
{a[0]=a[-1]+a[1];
{inta[10]={1,2,3,4,5,6,7,8,9,10};
sum(&
a[2]);
printf("
a[2]);
A、6B、7C、5D、8
本题考查的是函数参数的传递。
15.有以下程序
main()
{inta[10]={1,2,3,4,5,6,7,8,9,10},*p=&
a[3],*q=p+2;
*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的功能是将多个字符串按字典顺序排序
voidf(char*p[],intn)
{char*t;
for(i=0;
n-1;
for(j=i+1;
j<
j++)
if(strcmp(p[i],p[j])>
0){t=p[i];
p[i]=p[j];
p[j]=t;
{char*p[5]={"
aabdfg"
abbd"
dcdbe"
cd"
f(p,5);
strlen(p[1]));
A、2B、3C、6D、4
本题经过排序后,得到第二个字符串是"
,所以输出结果是4。
17.有以下程序
voidf(char*s,char*t)
{chark;
k=*s;
*s=*t;
*t=k;
s++;
t--;
if(*s)f(s,t);
{charstr[10]="
abcdefg"
*p;
p=str+strlen(str)/2+1;
f(p,p-2);
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)
t=*c0;
*c0=*c1;
*c1=t;
{inta[2]={3,5},b[2]={3,5};
swap1(a,a+1);
swap2(&
b[0],&
b[1]);
%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(&
起着同样的作用,使得指针变量c0指向了b[0]存储单元,c1指向了b[1]存储单元,并在swap2函数中发生了交换,所以b[0]、b[1]的值也发生变化,故本程序输出的结果是5353。
故本题答案为D。
19.有以下程序
{
inta[3][2]={0},(*ptr)[2],i,j;
i++){ptr=a+i;
ptr);
ptr++;
}
3;
i++)
{for(j=0;
j++)printf("
%2d"
a[i][j]);
}}
若运行时输入:
123<
回车>
,则输出结果是______。
A、产生错误信息B、10C、12D、10
203020
000030
本题定义了一个二维数组a,又定义了一个指针变量ptr,它用于指向包含2个元素的一维数组,在第一个for循环中,语句"
ptr=a+i;
用于将指针变量ptr指向第i行的数组元素,通过两次循环,分别给二维数组a的第0行的第1个元素和第1行的第1个元素赋了值1和2。
20.有以下程序
point(char*p){p+=3;
}
{charb[4]={'
a'
'
b'
c'
d'
},*p=b;
point(p);
*p);
A、aB、bC、cD、d
本题考查的是指针变量对数组的引用。
21.若有以下说明和语句
intc[4][5],(*p)[5];
p=c;
能够正确引用c数组元素的是______。
A、p+1B、*(p+3)C、*(p+1)+3D、*(p[0]+2)
本题考查的是数组元素的引用。
本题答案为D。
22.有以下程序
{inta[]={1,2,3,4,5,6,7,8,9,10,11,12,},*p=a+5,*q=NULL;
*q=*(p+5);
%d%d\n"
*p,*q);
A、运行后报错B、66C、611D、510
此题考查的是指针变量赋值。
本题将指针q赋值为空,即指向了空地址,而对空地址所对应的内容赋值*q=*(p+5)是会出错的,所以输出结果会报错。
所以此题答案为A。
23.有以下程序
{inta=7,b=8,*p,*q,*r;
q=&
b;
r=p;
p=q;
q=r;
%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.有以下程序
{charstr[][10]={"
China"
Beijing"
},*p=str;
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、'
C、不确定的值D、'
的地址
本题的考查点是字符数组的结束标志。
26.若已定义:
inta[9],*p=a;
并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是______。
A、p+1B、a+1C、a++D、++p
本题的考查点是数组地址的表示。
选项C中,数组名所表示的数组地址不能被重新赋值。
27.已定义以下函数
fun(char*p2,char*p1)
{while((*p2=*p1)!
='
){p1++;
p2++;
}}
函数的功能是______。
A、将p1所指字符串复制到p2所指内存空间B、将p1所指字符串的地址赋给指针p2
C、对p1和p2两个指针所指字符串进行比较
D、检查p1和p2两个指针所指字符串中是否有'
while((*p2=*p1)!
表示将p1所指向的值赋给*p2,即将p1所指字符串复制到p2所指内存空间。
在这里“*P2=*p1”是赋值操作,而不是比较是否相等,比较应当为双等号“==”。
所以B,C,D都不对。
28.若有定义:
int*p[3];
,则以下叙述中正确的是______。
A、定义了一个基类型为int的指针变量p,该变量具有三个指针
B、定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针
C、定义了一个名为*p的整型数组,该数组含有三个int类型元素
D、定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素
int*p[3]表示此数组是指针类型的,每个数组元素(指针变量)都可指向一个整型的指针变量。
29.设有定义:
inta,*pa=&
以下scanf语句中能正确为变量a读入数据的是___。
A、scanf("
pa);
B、scanf("
C、scanf("
pa);
D、scanf("
*pa);
scanf函数可以用来输入任何类型的多个数据。
30.有以下程序
{charch[]="
uvwxyz"
*pc;
pc=ch;
*(pc+5));
A、zB、0C、元素ch[5]的地址D、字符y的地址
本题中定义了一个字符串数组和指针,并将指针pc指向该数组的首地址,语句中的*(pc+5)指的就是pc[5]的值,所以最后输出的结果为z。
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。
33.设有以下定义和语句
charstr[20]="
Program"
p=str;
则以下叙述中正确的是______。
A、*P与str[0]中的值相等B、str与p的类型完全相同
C、str数组长度和p所指向的字符串长度相等
D、数组str中存放的内容和指针变量p中存放的内容相同
34.以下语句或语句组中,能正确进行字符串赋值的是______。
A、char*sp;
*sp="
right!
B、chars[10];
s="
C、chars[10];
*s="
D、char*sp="