C语言指针练习答案讲解.docx
- 文档编号:7066312
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:20
- 大小:26.69KB
C语言指针练习答案讲解.docx
《C语言指针练习答案讲解.docx》由会员分享,可在线阅读,更多相关《C语言指针练习答案讲解.docx(20页珍藏版)》请在冰豆网上搜索。
C语言指针练习答案讲解
第七章指针
7.1选择题
1.若有说明:
inta=2,*p=&a,*q=p;,则以下非法的赋值语句是(D)。
A.p=q;B.*p=*q;C.a=*q;D.q=a;
a是整型数,
int*p,*q定义了指针,
p,q是指向整型的指针。
p取得a的地址,而q取得p的地址
p,q是指针(也就是一个地址),而*p和*q是这个指针指向的整型数值(存放在这个地址的值)。
A)把q的地址赋给p,则p和q完全一样了,都指向一个数2
B)把q中数据个p
C)把q中数据给a
D)a中数据是2,不能够给一个地址。
除非*q=a
2.若定义:
inta=511,*b=&a;,则printf("%d\n",*b);的输出结果为:
D
A.无确定值B.a的地址C.512D.511
inta=511,*b=&a;
a是整形变量
b是整形指针变量,指向a
printf("%d\n",*b);就是输出指针变量b,
所指变量的值输出结果511
3.已有定义 inta=2,*p1=&a,*p2=&a;下面不能正确执行的赋值语句是(B)。
A.a=*p1+*p2;B.p1=a;C.p1=p2;D.a=*p1*(*p2);
47、已知在程序中定义了如下的语句:
int*P1,*P2;
intk;
p1=&k;p2=&k;
则下列语句中不能正确执行是(B)
A、k=*P1+*P2;B、p2=k;C、P1=P2;D、K=*P1*(*P2);
P1P2是指针,K是整型变量,变量怎么可以赋值给指针呢?
A其实是执行了K=K+K(P1和P2都指向K,所以*P1*P2其实都是指K)
C是赋值语句
D其实执行了K=K*K
4.变量的指针,其含义是指该变量的(B)。
A.值B.地址C.名D.一个标志
5.若有说明语句:
inta,b,c,*d=&c;,则能正确从键盘读入三个整数分别赋给变量a、b、c的语句是(A)。
A.scanf("%d%d%d",&a,&b,d);
B.scanf("%d%d%d",a,b,d);
C.scanf("%d%d%d",&a,&b,&d);
D.scanf("%d%d%d",a,b,*d);
对于intc,*d=&c;,c是一整型数据,d是一指针,它指向变量c(即d=&c,*是指针类型的说明符),所以,输入c的值可以用scanf("%d",&c);也可以用scanf("%d",d);
6.若已定义inta=5;下面对
(1)、
(2)两个语句的正确解释是(D)。
(1)int*p=&a;
(2)*p=a;
A.语句
(1)和
(2)中的*p含义相同,都表示给指针变量p赋值。
B.
(1)和
(2)语句的执行结果,都是把变量a的地址值赋给指针变量p。
C.
(1)在对p进行说明的同时进行初始化,使p指向a;
(2)变量a的值赋给指针变量p。
D.
(1)在对p进行说明的同时进行初始化,使p指向a;
(2)将变量a的值赋予*p。
A:
(1):
*p,定义p为int类型指针
(2):
*p,表示p所指向的变量
B
(1)把变量a的地址赋给指针变量p
(2)把变量a的值,赋值给P所指向的变量
C前半句正确,后半句错误,
(2)是把变量a的值赋值给P所指的变量。
7.若有语句int*p,a=10;p=&a;下面均代表地址的一组选项是(D)。
A.a,p,*&aB.&*a,&a,*p
C.*&p,*p,&aD.&a,&*p,p
int*p是定义一个指针,p=&a,p指向a的地址,*p=a,*指针名是指取该指针所指地址中的内容,&a为a的地址,&*p=&a,p中放的为a的地址
8.若需要建立如图所示的存储结构,且已有说明double*p,x=0.2345;则正确的赋值语句是()。
B
A.p=x;B.p=&x;
C.*p=x;D.*p=&x;
9.若有说明:
int*p,a=1,b;以下正确的程序段是(B)。
A.p=&b;B.scanf("%d",&b);
scanf("%d",&p);*p=b;
C.p=&b;D.p=&b;
scanf("%d",*p);*p=a;
A,B中p是b的地址那么如果要输入b应该是scanf("%d",p);
C中p还没定义给*p赋值就是给一个没有开辟的地址赋值了
D是正确的意思是p为b的地址,将p地址上的数变成a,等价于b=a
10.有如下语句:
intm=6,n=9,*p,*q;p=&m;q=&n;如图1所示,若要实现下图所示的存储结构,可选用的赋值语句是(C)。
A.*p=*q;B.p=*q;
C.p=q;D.*p=q;
11.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是(B)。
#include
main()
{
int*p,*q,a,b;
p=&a;
printf("inputa:
");
scanf("%d",*p);
…
}
A.*p表示的是指针变量p的地址
B.*p表示的是变量a的值,而不是变量a的地址
C.*p表示的是指针变量p的值
D.*p只能用来说明p是一个指针变量
scanf后面的参数是地址,是接收的值放到这个地址
12.下面程序的功能是从输入的十个字符串中找出最长的那个串。
请在________处填空。
#include"stdio.h"
#include"string.h"
#defineN10
main()
{
chars[N][81],*t;
intj;
for(j=0;j gets(s[j]); t=*s; for(j=1;j if(strlen(t) printf("themaxlengthoftenstringsis: %d,%s\n",strlen(t),t); } A.t=s[j]B.t=&s[j]C.t=s++D.t=s[j][0] 13.下面判断正确的是(C)。 A.char*s="girl";等价于char*s;*s="girl"; B.chars[10]={"girl"};等价于chars[10];s[10]={"girl"}; C.char*s="girl";等价于char*s;s="girl"; D.chars[4]="boy",t[4]="boy";等价于 chars[4]=t[4]="boy" 14.设char*s="\ta\017bc";则指针变量s指向的字符串所占的字节数是(C)。 A.9B.5C.6D.7 首先,字节数不是指字符串长度,字符串长度比存储字节数少一。 \t是一个转义字符相当于键盘“Tab” 键a普通字符 \017转义字符ASCII代码值为8进制数17即10进制数15的那个符号 b普通字符c普通字符 字符串结束标志‘\0’ s是字符串类型。 每一个都是char型变量; char型变量的二进制长度是8,也就是一个字节,所以指针变量s指向的字符串所占字节数是6,字符串长度是5. 15.下面程序段中,for循环的执行次数是(C)。 char*s="\ta\018bc"; for(;*s! ='\0';s++)printf("*"); \ta\018bc\0各一次 A.9B.5C.6D.7 16.以下不能正确进行字符串赋初值的语句是(A)。 A.charstr[5]="good! "; B.char*str="good! "; C.charstr[]="good! "; D.charstr[5]={'g','o','o','d'}; 1A.charstr[5]={"good! "};//这个不符合C语言的语法规定,字符串初始化是这样写的: charstr[6]="good! ";//因最后还有一个结束符,因此数组元素应该是6个。 2题目表述有些不准确C,D叫初始化,B叫赋值。 3题目中的单双引号全部是中文的,这也不符合C语言语法。 应该改为英文的。 17.若指针p已正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是(A)。 A.p=2*(int*)malloc(sizeof(int)); B.p=(int*)malloc(2*sizeof(int)); C.p=(int*)malloc(2*2); D.p=(int*)calloc(2,sizeof(int)); malloc的全称是memoryallocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。 18.下面程序段的运行结果是(C)。 char*s="abcde"; s+=2; printf("%d",s); A.cdeB.字符'c'C.字符'c'的地址D.无确定的输出结果 19.设有如下的程序段: chars[]="girl",*t;t=s;则下列叙述正确的是(D)。 A.s和t完全相同 B.数组s中的内容和指针变量t中的内容相等 C.s数组长度和t所指向的字符串长度相等 D.*t与s[0]相等 20.以下正确的程序段是(B)。 A.chars[20];B.char*s; scanf("%s",&s);scanf("%s",s); C.chars[20];D.chars[20],*t=s; scanf("%s",&s[2]);scanf("%s",t[2]); 21.下面程序段的运行结果是(C)。 #include"stdio.h" main() { intm=10,n=20; char*format="%s,m=%d,n=%d\n"; m*=n; printf(format,"m*=n",m,n); } A.format,"m*=n",m,nB.format,"m*=n" C.m*=n,m=200,n=20D.以上结果都不对 22.以下与库函数strcpy(char*p,char*q)功能不相等的程序段是(D)。 A.strcpy1(char*p,char*q) {while((*p++=*q++)! ='\0'); } B.strcpy2(char*p,char*q) {while((*p=*q)! ='\0') {p++;q++;} } C.strcpy3(char*p,char*q) {while(*p++=*q++); } D.strcpy4(char*p,char*q) {while(*p) *p++=*q++; } 23.下面程序段的运行结果是(C)。 #include"stdio.h" main() { chars[]="example! ",*t; t=s; while(*t! ='p') {printf("%c",*t-32); t++;} } A.EXAMPLE! B.example! C.EXAMD.example! 24.以下正确的程序段是(C)。 A.chars[]="12345",t[]="6543d21";strcpy(s,t); B.chars[20],*t="12345";strcat(s,t); C.chars[20]="",*t="12345";strcat(s,t); D.char*s="12345",*t="54321";strcat(s,t); 25.以下与库函数strcmp(char*s,chat*t)的功能不相等的程序段是(D)。 A.strcmp1(char*s,chat*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); } 26.若有以下定义和语句: ints[4][5],(*ps)[5]; ps=s; 则对s数组元素的正确引用形式是(C)。 A.ps+1B.*(ps+3)C.ps[0][2]D.*(ps+1)+3 27.不合法的main函数命令行参数表示形式是: (B)。 A.main(inta,char*c[])B.main(intargc,char*argv) C.main(intarc,char**arv)D.main(intargv,char*argc[]) 28.若有说明语句: chars[]="itisaexample.",*t="itisaexample.";则以下不正确的叙述(B)。 A.s表示的是第一个字符i的地址,s+1表示的是第二个字符t的地址 B.t指向另外的字符串时,字符串的长度不受限制 C.t变量中存放的地址值可以改变 D.s中只能存放16个字符 29.若已定义chars[10];则在下面表达式中不表示s[1]地址的是(B)。 A.s+1B.s++C.&s[0]+1D.&s[1] 30.下面程序段的运行结果是(A)。 (注: └┘代表空格) #include"stdio.h" main() {chars[6]; s="abcd"; printf("\"%s\"\n",s); } A."abcd"B."abcd└┘"C.\"abcd\"D.编译出错 31.执行以下程序后,a的值为【1】,b的值为【2】。 #include main() { inta,b,k=4,m=6,*p=&k,*q=&m; a=p==&m; b=(-*p)/(*q)+7; printf("a=%d\n",a); printf("b=%d\n",b); } 【1】A.-1B.1C.0D.4 【2】A.5B.6C.7D.10 32.下面程序的功能是将字符串s的所有字符传送到字符串t中,要求每传递三个字符后再存放一个空格,例如字符串s为"abcdefg",则字符串t为"abcdefg",请选择填空。 CA #include"stdio.h" #include"string.h" main() { intj,k=0; chars[60],t[100],*p; p=s; gets(p); while(*p) {for(j=1;j<=3&&*p;【1】)t[k]=*p; if(【2】){t[k]='';k++;} } t[k]='\0'; puts(t); } 【1】A.p++B.p++,k++C.p++,k++,j++D.k++,j++ 【2】A.j==4B.*p=='\0'C.! *pD.j! =4 33.下面程序的功能是将八进制正整数字符串转换为十进制整数。 请选择填空。 错题AB #include"stdio.h" #include"string.h" main() { char*t,s[8]; intn; t=s; gets(t); n=【1】; while(【2】! ='\0')n=n*8+*t-'0'; printf("%d\n",n); } 【1】A.0B.*tC.*t-'0'D.*t+'0' 【2】A.*tB.*t++C.*(++t)D.t 34.下面程序的功能是在字符串s中找出最大的字符并放在第一个位置上,并将该字符前的原字符往后顺序移动,如: boy&girl变成ybo&girl。 请选择填空。 BC #include"stdio.h" #include"string.h" main() { chars[80],*t,max,*w; t=s; gets(t); max=*(t++); while(*t! ='\0') { if(max<*t) {max=*t;w=t;} t++; } t=w; while(【1】) { *t=*(t-1); 【2】;} *t=max; puts(t); } 【1】A.t>sB.t>=sC.*t>s[0]D.*t>=s[0] 【2】A.t++B.s--C.t--D.w-- 35.以下程序的功能是删除字符串s中的所有空格(包括TAB符、回车符),请填空。 AC #include"stdio.h" #include"string.h" #include"ctype.h" main() { chars[80]; gets(s); delspace(s); puts(s); } delspace(char*t) { intm,n; charc[80]; for(m=0,n=0;【1】;m++) if(! isspace(【2】))/*C语言提供的库函数,用以判断字符是否为空格*/ { c[n]=t[m]; n++; } c[n]='\0'; strcpy(t,c); } 【1】A.t[m]B.! t[m]C.t[m]='\0'D.t[m]=='\0' 【2】A.t+mB.*c[m]C.*(t+m)D.*(c+m) 36.下面程序的功能是统计字串sub在母串s中出现的次数。 请选择填空。 BC #include"stdio.h" #include"string.h" main() { chars[80],sub[80]; intn; gets(s); gets(sub); printf("%d\n",count(s,sub)); } intcount(char*p,char*q) { intm,n,k,num=0; for(m=0;p[m];m++) for(【1】,k=0;q[k]==p[n];k++,n++) if(q[【2】]=='\0') {num++;break;} return(num); } 【1】A.n=m+1B.n=mC.n=0D.n=1 【2】A.kB.k++C.k+1D.++k 37.下列程序的输出结果是(C)。 #include"stdio.h" main() { inta[]={1,2,3,4,5,6,7,8,9,0},*p; p=a; printf("%d\n",*p+9); } A.0B.1C.10D.9 38.以下程序的输出结果是(C)。 #include"stdio.h" charcchar(charch) { if(ch>='A'&&ch<='Z')ch=ch-'A'+'a'; returnch; } main() { chars[]="ABC+abc=defDEF",*p=s; while(*p) { *p=cchar(*p); p++; } printf("%s\n",s); } A.abc+ABC=DEFdefB.abcaABCDEFdef C.abc+abc=defdefD.abcabcdefdef 39.以下程序的输出结果是(D)。 #include"stdio.h" #include"string.h" main() { charb1[8]="abcdefg",b2[8],*pb=b1+3; while(--pb>=b1)strcpy(b2,pb); printf("%d\n",strlen(b2)); } A.8B.3C.1D.7 40.有以下程序 #include"string.h" #include"stdio.h" main() { char*p="abcde\0fghjik\0"; printf("%d\n",strlen(p)); } 程序运行后的输出结果是(D)。 A.12B.15C.6D.5 41.有以下程序 voidss(char*s,chart) { while(*s) {if(*s==t)*s=t-'a'+'A'; s++; } } main() { charstr[100]="abcddfefdbd",c='d'; ss(str,c); printf("%s\n",str1); } 程序运行后的输出结果是(B)。 A.ABCDDEFEDBDB.abcDDfefDbDC.abcAAfefAbAD.Abcddfefdbd 42.以下程序调用findmax函数返回数组中的最大值。 在下面划线处应填入的是(B)。 #include"stdio.h" findmax(int*a,intn) { int*p,*s; for(p=a,s=a;p-a if(__________)s=p; return(*s); } main() { intx[5]={12,21,13,6,18}; printf("%d\n",findmax(x,5)); } A.p>sB.*p>*sC.a[p]>a[s]D.p-a>p-s 43.有以下程序A #include"stdio.h" #include"malloc.h" main() { char
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指针 练习 答案 讲解