《2022年C语言指针练习答案讲解 .pdf》由会员分享,可在线阅读,更多相关《2022年C语言指针练习答案讲解 .pdf(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、学而不思则惘,思而不学则殆第七章指针71 选择题1 若有说明: int a=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
2、 若定义: int a=511, *b=&a; ,则 printf(%dn, *b);的输出结果为: D A 无确定值 B a 的地址 C 512 D 511 int a=511,*b=&a; a 是整形变量b 是整形指针变量,指向 a printf(%dn,*b);就是输出指针变量 b ,所指变量的值输出结果511 3 已有定义int a=2, *p1=&a, *p2=&a; 下面不能正确执行的赋值语句是 (B) 。A a=*p1+*p2; B p1=a; C p1=p2; D a=*p1*(*p2); 47、已知在程序中定义了如下的语句:int *P1,*P2; int k; p1=&k;
3、p2=&k; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 1 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆则下列语句中不能正确执行是( B )A、k=*P1+*P2; B 、p2=k; C 、P1=P2; D 、K=*P1 * (*P2); P1 P2 是指针, K是整型变量,变量怎么可以赋值给指针呢?A其实是执行了 K=K+K (P1和 P2都指向 K,所以 *P1 *P2 其实都是指 K)C是赋值语句D其实执行了 K=K*
4、K 4 变量的指针,其含义是指该变量的(B) 。A 值 B 地址 C 名 D 一个标志5 若有说明语句: int a, 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); 对于 int c,*d=&c;,c 是一整型数据, d 是一指针,它指向变量c(即 d=&c,*是指针类型的说明符), 所以,输入c 的值可以用scanf(%d,
5、&c); 也可以用scanf(%d,d); 6 若已定义 int a=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,
6、表示 p 所指向的变量B(1)把变量 a 的地址赋给指针变量p(2)把变量 a 的值,赋值给 P所指向的变量C前半句正确,后半句错误, (2)是把变量 a 的值赋值给 P所指的变量。名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 2 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆7 若有语句 int *p, a=10; p=&a; 下面均代表地址的一组选项是(D) 。A a, p, *&a B &*a, &a, *p C *&p,
7、*p, &a D &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=&
8、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有如下语句: int m=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)
9、。 #include main() 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 3 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆int *p, *q, a, b; p=&a; printf(input a:); scanf(%d, *p); A *p 表示的是指针变量p 的地址B *p 表示的是变量 a 的值,而不是变量a 的地址C *p 表示的是指针变量p 的值D *p 只能用来说明 p 是一个指针变量scanf 后面的参数
10、是地址,是接收的值放到这个地址12下面程序的功能是从输入的十个字符串中找出最长的那个串。请在_处填空。 #include stdio.h #include string.h #define N 10 main() char sN81, * t; int j; for (j=0; jN; j+) gets (sj); t= *s; for (j=1; jN; j+) if (strlen(t)strlen(sj) _A_; printf(the max length of ten strings is: %d, %sn, strlen(t), t); A t=sj B t=&sj C t= s+
11、 D t=sj0 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 4 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆13下面判断正确的是( C ) 。A char *s=girl; 等价于 char *s; *s=girl; Bchar s10=girl; 等 价 于char s10; s10=girl; C char *s=girl; 等价于 char *s; s=girl; D char s4= boy, t4= boy; 等价
12、于char s4=t4= boy 14设 char *s=ta017bc;则指针变量 s 指向的字符串所占的字节数是 (C ) 。A 9 B 5 C 6 D 7 首先,字节数不是指字符串长度,字符串长度比存储字节数少一。t 是一个转义字符相当于键盘“ Tab”键 a 普通字符017 转义字符 ASCII 代码值为 8 进制数 17即 10进制数 15的那个符号b 普通字符 c 普通字符字符串结束标志 0 s 是字符串类型。每一个都是char 型变量;char 型变量的二进制长度是8,也就是一个字节,所以指针变量s 指向的字符串所占字节数是6 ,字符串长度是 5. 15下面程序段中, for 循
13、环的执行次数是( C) 。 char *s=ta018bc; for (;*s!=0;s+) printf(*); t a 018 b c 0各一次A 9 B 5 C 6 D 7 16以下不能正确进行字符串赋初值的语句是(A) 。A. char str5= good!; B char *str=good!; C. char str=good!; D char str5=g, o,o, d; 1 A.char str5=good!;/这个不符合 C语言的语法规定,字符串初始化是这样写的:名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资
14、料 - - - - - - - - - - - - - - - 第 5 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆char str6=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
15、=(int *)malloc(2*2); D p=(int*)calloc(2, sizeof(int); malloc 的全称是 memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候, 想要绑定真正的内存空间, 就需要用到动态的分配内存。18下面程序段的运行结果是(C ) 。char *s=abcde; s+=2; printf(%d, s); A cde B 字符c C 字符c 的地址 D 无确定的输出结果19 设有如下的程序段: char s=girl, *t; t=s;则下列叙述正确的是 (D ) 。A s 和 t 完全相同B 数组 s 中的内容和指针变
16、量t 中的内容相等C s 数组长度和 t 所指向的字符串长度相等D *t与 s0 相等20以下正确的程序段是( B) 。A char s20; B char *s; scanf(%s, &s); scanf(%s, s); C char s20; D char s20, *t=s; scanf(%s, &s2); scanf(%s, t2); 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 6 页,共 21 页 - - - - - - - - - 学而不思则惘,思而
17、不学则殆21下面程序段的运行结果是(C ) 。#include stdio.h main() int m=10, n=20; char *format=%s, m=%d, n=%dn; m*=n; printf(format, m*=n, m,n); A format, m*=n, m, n B format, m*=n C m*=n, m=200, n=20 D 以上结果都不对22以下与库函数 strcpy(char *p, char *q)功能不相等的程序段是( D) 。A strcpy1(char *p, char *q) while (*p+=*q+)!=0); B strcpy2(
18、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() 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 7 页,共 21 页 - - - - - - - - - 学而不
19、思则惘,思而不学则殆 char s=example!, *t; t=s; while( *t!=p) printf(%c, *t-32); t+; AEXAMPLE! Bexample! CEXAM D example! 24以下正确的程序段是( C) 。A char s=12345, t=6543d21; strcpy( s,t); B char s20, *t=12345; strcat(s,t); C char s20= , *t=12345; strcat(s, t); D char *s=12345, *t=54321; strcat (s,t); 25以下与库函数 strcmp(c
20、har *s, chat *t)的功能不相等的程序段是(D ) 。A strcmp1( char *s, chat *t) for ( ;*s+=*t+ ;) if (*s=0) return 0; return (*s-*t); B strcmp2( char *s, char *t) for ( ;*s+=*t+ ;) if (!*s) return 0; return (*s-*t); C strcmp3( char *s, char *t) for ( ;*t=*s ;) if (!*t) return 0; t+; s+; 名师归纳总结 精品学习资料 - - - - - - - -
21、- - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 8 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆 return (*s-*t); D strcmp4( char *s, char *t) for( ;*s=*t ;s+,t+) if (!*s) return 0; return (*t-*s); 26若有以下定义和语句:int s45, (*ps)5; ps=s; 则对 s 数组元素的正确引用形式是(C) 。A ps+1 B *(ps+3) C ps02 D *(ps+1)+3 27不合法
22、的 main 函数命令行参数表示形式是: (B) 。A main( int a, char *c) B main(int argc, char *argv) C main( int arc, char *arv) D main( int argv, char*argc) 28若有说明语句: char s=it is a example, *t=it is a example.;则以下不正确的叙述( B) 。A s 表示的是第一个字符i 的地址, s+1 表示的是第二个字符t 的地址B t 指向另外的字符串时,字符串的长度不受限制C t 变量中存放的地址值可以改变D s 中只能存放 16 个字符
23、29若已定义 char s10;则在下面表达式中不表示s1 地址的是( B) 。A s+1 B s+ C &s0+1 D &s1 30下面程序段的运行结果是(A) 。 (注:代表空格) #include stdio.h main() char s6; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 9 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆s=abcd; printf(%sn, s); A abcd B abcd C abc
24、d D 编译出错31执行以下程序后, a 的值为【 1】 , b 的值为【 2】 。#include main() int a, b, k=4, m=6, *p=&k, *q=&m; a=p=&m; b=(-*p)/(*q)+7; printf(a=%dn, a); printf(b=%dn, b); 【1】 A -1 B 1 C 0 D 4 【2】 A 5 B 6 C 7 D 10 32下面程序的功能是将字符串s 的所有字符传送到字符串t 中,要求每传递三个字符后再存放一个空格, 例如字符串 s 为abcdefg , 则字符串 t 为abc def g, 请选择填空。 C A #includ
25、e stdio.h #include string.h main() int j, k=0; char s60, t100, *p; p=s; gets(p); while(*p) for (j=1; j=3 & *p; 【1】) tk=*p; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 10 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆if (【2】) tk= ; k+; tk=0; puts(t); 【1】Ap+ Bp+,
26、k+ Cp+, k+, j+ D k+, j+ 【 2 】A j=4 B *p=0 C!*p D j!=4 33下面程序的功能是将八进制正整数字符串转换为十进制整数。请选择填空。错题 AB #include stdio.h #include string.h main() char *t, s8; int n; t=s; gets(t); n= 【1】; while (【2】!= 0) n=n*8+*t-0; printf(%dn, n); 【 1 】 A0 B*t C*t-0 D *t+0 【2】 A *t B *t+ C *(+t) D t 34下面程序的功能是在字符串s 中找出最大的字符
27、并放在第一个位置上,并将该字符前的原字符往后顺序移动,如:boy&girl变成 ybo&girl 。请选择填空。BC 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 11 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆#include stdio.h #include string.h main() char s80, *t, max, *w; t=s; gets(t); max=*(t+); while (*t!=0) if (m
28、axs Bt=s C*ts0 D *t=s0 【 2 】 At+ Bs- Ct- D w- 35以下程序的功能是删除字符串s 中的所有空格(包括TAB符、回车符),请填空。 AC #include stdio.h 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 12 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆 #include string.h #include ctype.h main() char s80; gets(s);
29、 delspace(s); puts(s); delspace(char *t) int m, n; char c80; for(m=0, n=0; 【1】; m+) if (!isspace(【2】) /*C语言提供的库函数,用以判断字符是否为空格*/ cn=tm; n+; cn=0; strcpy(t, c); 【1】 Atm B!tm Ctm=0 D tm=0 【 2 】 At+m B*cm C*(t+m) D *(c+m) 36下面程序的功能是统计字串sub 在母串 s 中出现的次数。请选择填空。BC #include stdio.h 名师归纳总结 精品学习资料 - - - - - -
30、 - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 13 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆 #include string.h main() char s80, sub80; int n; gets(s); gets(sub); printf(%dn, count(s,sub); int count( char *p, char *q) int m, n, k, num=0; for (m=0; pm; m+) for (【1】, k=0; qk=pn; k+, n+)
31、if(q【2】=0) num+; break; return (num); 【1】 A n=m+1 B n=m C n=0 D n=1 【2】 A k B k+ C k+1 D +k 37下列程序的输出结果是(C) 。#include stdio.h main() int a=1,2,3,4,5,6,7,8,9,0, *p; p=a; printf(%dn, *p+9); A0 B1 C10 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 14 页,共 21 页 -
32、 - - - - - - - - 学而不思则惘,思而不学则殆D 9 38以下程序的输出结果是(C) 。#include stdio.h char cchar(char ch) if (ch=A & ch=b1) strcpy(b2, pb); printf(%dn, strlen(b2); 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 15 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆 A 8 B 3 C 1 D 7 40有以下
33、程序#include string.h #include stdio.h main() char *p=abcde0fghjik0; printf(%dn, strlen(p); 程序运行后的输出结果是(D) 。A 12 B 15 C 6 D 5 41有以下程序void ss( char *s, char t) while (*s) if (*s=t) *s=t-a+A; s+; main() char str100=abcddfefdbd, c=d; ss(str, c); printf(%sn, str1); 程序运行后的输出结果是(B) 。A ABCDDEFEDBD B abcDDfef
34、DbD C abcAAfefAbA D Abcddfefdbd 42以下程序调用 findmax 函数返回数组中的最大值。 在下面划线处应填入的是名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 16 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆(B) 。#include stdio.h findmax( int *a, int n) int *p, *s; for (p=a, s=a; p-as B *p*s C apas D p
35、-ap-s 43有以下程序 A #include stdio.h #include malloc.h main() char *q, *p; p=(char*) malloc (sizeof(char) *20); /*为指针 p 分配一个地址 */ q=p; scanf(%s%s, p, q); printf(%s %sn, p, q); 若从键盘输入: abc def ,则输出结果是:A def def B abc def C abc d D d d 44下面程序的运行结果是(D) 。名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学
36、习资料 - - - - - - - - - - - - - - - 第 17 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆 #include stdio.h #include string.h fun( char *s) char t10; s=t; strcpy(t, example); main() char *s; fun(s); puts(s); Aexample Bexample Cexample D不确定的值45下列程序段的输出结果是(A) 。#include stdio.h void fun( int *x, int *y) printf(%d
37、%d, *x, *y); *x=3; *y=4; main() int x=1, y=2; fun(&y, &x); printf(%d %d, x, y); 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 18 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆 A 2 1 4 3 B 1 2 1 2 C 1 2 3 4 D 2 1 1 2 46下列程序的输出结果是(C) 。#include stdio.h main() char a
38、10=9,8,7,6,5,4,3,2,1,0, *p=a+5; printf(%d, *-p); A非法 B a4 的地址 C 5 D 3 47有以下程序#include stdio.h #include string.h main(int argc, char *argv) int m, length=0; for (m=1;margc; m+) length+=strlen(argvm); printf(%dn, length); 程序编译连接后生成的可执行文件是file.exe,若执行时输入带参数的命令行是:file 1234 567 89则运行结果是( C) 。A 22 B 17 C
39、13 D 9 48有以下函数:char *fun(char *s) return s; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 19 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆 该函数的返回值是( D ) 。A 无确定值 B 形参 s 中存放的地址值C 一个临时存储单元的地址 D 形参 s 自身的地址值49假定下列程序的可执行文件名为file.exe,则在该程序所在的子目录下输入命令行: file girl boy后,程
40、序的输出结果是( B) 。#include stdio.h main(int argc, char *argv) int m; if (argc=0) return; for (m=1; m1) printf(%s%c, *argv, (argc1)? n: ); B main( int a, char * b) 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 20 页,共 21 页 - - - - - - - - - 学而不思则惘,思而不学则殆 while (a-1) printf(%sn, *+b); C main( int argc, char *argv) while (+argc0) printf(%s%c, *+argv, (argc1) ? :n); D main(int argc, char *argv) while (argc1) printf(%s, *+argv); 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 21 页,共 21 页 - - - - - - - - -