1、C语言程序设计 第九章 指针一、选择题1、指针是一种_A、标识符 B、变量 C、内存地址 D、运算符2、显示指针变量P中的值,可以使用命令_A、Printf(“%d”,p); B、Printf(“%d”,*p);C、Printf(“%d”,*p); D、Printf(“%d”,p);3、为指针变量P输入整型变量i的地址,可以使用命令_A、Scanf(“%p”,&p); B、*p=i; C、P=&I;D、*p=&I;4、若有定义void *p;int *q;float *r,下面操作不对的是_A、p=q; B、q=r; C、p=r; D、r=p;5、若有说明#define m 20 int n=
2、10;下面定义不正确的是_A、Float sm; B、Float sm*10; C、Float sm+n;D、Float sm+10;6、若有定义int a=1,2,0;请问aaa0=_A、0 B、1 C、2 D、37、若有char s10,*p=s;则下面表达式正确的是_A、s=p+s; B、p=s+10; C、s2=p4; D、p=s0;8、定义整型指针变量p和q,下面操作不正确的是_A、Int *p,q=null; B、Int *p,q=null,null; C、Int *p,*q=null,null;D、Int *p,*q=null;9、若有定义int a=1,2,3,b3=1,2,3
3、;,请问a=b_A、不能比较 B、结果为真 C、结果为假 D、结果不确定 10、以下程序有错,错误的原因是( )。 main() int *p,i;char *q,ch; p=&i;q=&ch; *p=40; *p=*q; . . .A)p和q的类型不一致,不能执行*p=*q;语句B)*p中存放的是地址值,因此不能执行*p=40;语句C)q没有指向具体的存储单元,所以*q没有实际意义D)q虽然指向了具体的存储单元,但该单元中没有确定的值,所以不能执行*p=*q;语句11、已有定义 int k=2;int *ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是(
4、 )。A)k=*ptr1+*ptr2; B)ptr2=k; C)p1=*p2; D)*p1=p2;12、变量的指针,其含义是指该变量的( )。 A)值 B)地址 C)名 D)一个标志13、若已定义int a=5;下面对(1),(2)两个语句的正确解释是( )。 (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的
5、值赋于*p14、若有语句int *point,a=4;和point=&a; 下面均代表地址的一组选项是( )。 A)a,point,*&a B)&*a,&a,*point C)*&point,*point,&a D)&a,&*point,point15、以下程序输出的结果是( )void main() int a=5,*p1,*p2;p1=&a,p2=&p1;(*p1)+;printf(“%dn”,*p2);A) 5 B) 4 C) 6 D) 不确定16、若有说明:int *p,m=5,n; 以下正确的程序段是( )。A)p=&n; B)p=&n; scanf(“%d”,&p); scanf(
6、“%d”,*p);C)scanf(“%d”,&n); D)p=&n; *p=n; *p=m17、若有说明:int *p1,*p2,m=5,n;以下均是正确赋值语句的选项是( )。 A)p1=&m;p2=&p1; B)p1=&m;p2=&n;*p1=*p2; C)p1=&m;p2=p1 D)p1=&m;*p2=*p1;18、已有变量定义和函数调用语句:int a=25; print_value(&a);下面函数的正确输出结果是( )。 void print_value(int *t) print(“%dn”,+*x); A)23 B)24 C)25 D)2619、下面判断正确的是( )。A)ch
7、ar * a=”china”;等价于 char *a;*a=”china”;B)char str10=“china”;等价于char str10;str=“china”;C)char *s=”china”; 等价于 char *s; s=”china”;D)char c4=”abc”,d4=”abc”; 等价于 char c4=d4=”abc”;20、设 char *s=”ta017bc”; 则指针变量s指向的字符串所占的字节数是( )。 A)9 B)5 C)6 D)7 21、下面程序段中,for循环的执行次数是( )。 char *s=”ta018bc”; for ( ;*s! =0;s+)
8、 printf(“*”); A)9 B)5 C)6 D)722、下面能正确进行字符串赋值操作的是( )。 A) char s5=“ABCDE”; B) char 5=A,B,C,D,E; C) char *s; s=”ABCDE”; D) char *s; scanf(“%s”,s);23、下面程序段的运行结果是( )。 char *s=”abcde”; s+=2; printf(“%d”,s); A)cde B)字符c C)字符c的地址 D)无确定的输出结果24、设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是( )。 A)c=*p1+p2; B)p2=
9、c C)p1=p2 D)c=*p1*(*p2);25、有下面的程序段: chat s=”china”; char *p; p=s; 则下列叙述正确的是( )。A)s和p完全相同 B)数组s中的内容和指针变量p中的内容相等C)s数组长度和p所指向的字符串长度相等 D)*p与s0相等26、下面程序的运行结果是( )。 #include #include main() char *p1,*p2,str50=”abc”;p1=”abc”; p2=”abc”;strcpy(str+1,strcat(p1,p2);printf(“%sn”,str);A) abcabcabc B)bcabcabc C) a
10、abcabc D)cabcabc27、下面程序的运行结果是( )。 #include main()char str=”cdalb”;abc(str);puts(str);abc(char *p)int i,j;for(i=j=0;*(p+i)!=0;i+)if(*(p+i)=d) *(p+j)=*(p+i); j+;*(p+j)=0; A)dalb B)cd C)dl D)c28、下面程序运行结果是( )。 #include fun(char*p) int i,j; char ts81;for(i=0,t=0;pi!=0;i+=2)if(! isspace(*p+i)&(*(p+i)!=a)t
11、st=0;strcpy(p,ts);main()char str81=“a b c d ef g”;fun(str);puts(str);A) abcdeg B)bcde C)ABCDE D)BCDE 29、若有以下定义,则对a数组元素的正确引用是( )。 int a5,*p=a; A) *&a5 B) a+2 C) *(p+5) D)*(a+2)30、若有以下定义,则对a数组元素地址的正确引用是( )。 int a5,*p=a;A) p=5 B)*a+1 C)&a+1 D)&a031、若有定义:int a23;则对数组a的第i行第j列(假设i,j已正确说明并赋值)元数值的正确引用为( )。
12、A)*(*(i+j)+j) B)(a+i)j C)*(a+i+j) D)*(a+i)+j32、若有定义:int a23;则对数组a的第i行第j列(假设i,j已正确说明并赋值)元数地址的正确引用为( )。A)*(ai+j) B)(a+i) C)*(a+j) D)ai+j33、若有以下定义和语句,则对a数组元素地址的正确引用是( )。 int a23,(*p)3; p=a;A)*(p+2) B)p2 C)p1+1 D)(p+1)+234、若有以下定义和语句,则对a数组元素地址的正确引用是( )。 int a23,(*p)3; p=a; A)(p+1)0 B)*(*(p+2)+1) C)*(p1+1
13、) D)p1+235、若有定义:int a5;则a数组中首元素的地址可以表示为( )。A)&a B)a+1 C)a D)&a136、 若有定义:int (*p)4;则标识符p( )。A)是一个指向整型变量的指针 B)是 一个指针数组名C)是一个指针,它指向一个含有四个整型元素的一维数组 D)定义不合法37、若有以下定义和赋值语句,则对s数组的第i行第j列(假设i,j已正确说明并赋值)元素地址的合法引用为( )。ints23=0,(*p)3;p=s;A)*(*(p+i)+j) B)*(pi+j) C)(p+i)+j D)(*(p+i)j38、若有以下定义和赋值语句,则对b数组的第i行第j列(假设
14、i,j已正确说明并赋值)元素地址的非法引用为( )。int b23=0,(*p)3;p=b;A)*(*(p+i)+j) B)*(pi+j)C)(p+i)+j D)(*(p+i)j39、以下与int *q5;等价的定义语句是( )。A)int q5 B)int*q C)int*(q5); D)int(*q)540、设有以下程序段: char str410=“first”,“second”,“third”,“fourth”,*strp4; int n;for(n=0;n4;n+) strpn=strn;若k为int型变量且0=k4,则对字符串的不正确引用是( )。A)strp B)strk C)s
15、trpk D)*strp二 、填空题1、二级指针是存放一级指针的_2、指针变量虽然都是存放指针,但_不同3、空指针名称是_,表示没有指针的一种状态4、函数名和_名可以作为指针常量5、不同类型的指针变量的赋值必须_6、以下的运行结果是【 】。 #includemain()int I,k; for(I=0;I0);print(“%dn”,t);11、下面程序段的运行结果是【】。 char=”12345,*p;int s=0;for(p=a;*p!=0;p+) s=10*s+*p-0;printf(“%s”,P+5);12、下面程序段的运行结果是【】。 har str=”abc0def0ghi”,*
16、p=str; printf(“%s”,p+5);13、下面程序段的运行结果是【】。 char *p=”PDP1-0”; int i,d; for(i=0;i7;i+)d=isdigit(*(p+ii);if(d!=0) printf(“%c *(p+i);14、 当运行以下程序时,从键盘输入 book book (表示回车, 表示空格),则下面程序段运行的结果是【 】。char a180,a280,*s1=a1,*s2=a2;gets(s1);gets(s2);if(!strcmp(s1,s2) printf(“*”);else printf(“#”);printf(“%d”,strlen(s
17、trcat(s1,s2);15、下面程序段的运行结果是【 】。char a=”123456789”,*p;int i=0;p=a;while(*p) if(i%2=0) p=*; p+; i+; puts(a)16、下面程序的运行结果是【】。#include s(char *s)char *p=s; while(*p) p+; return(p-s);main() char *a=”abcd”; int i; i=s(a); printf(“%d”,i);17、下面程序的运行结果是【】。#includemain() char *strc(char str1,charstr2); char s1
18、80=”computer”,s2=”language” *p; pt=strc(s1,s2); printf(”%sn”,pt);char *strc(char * strl, char*str2) char*p; for(p=strl;*p!=0P+); dop+=*str2+;while(“str2 !=o); *p=o;return(strl);18、当运行以下程序时从键盘输入this is a text(表示回车),则下面程序的运行结果是【 】。#include#define TURE 1#define FALSE 0int change(char 0 c,int status)mai
19、n() int flag=TURE; char ch;doch=getchar(); flag=change(&ch,flag); putchar(ch); while(ch!.); printf(“n”);int change(char *c, int status)if (*c= = )returnTRUE elseif(status 8*c=a) *c+=A-a; return FALSE;19、若有定义:int a23=2,4,6,8,10,12;则*(&a00+2*2+1)的值是【 】, *(a1+2)的值是【 】。20、若有以下定义和语句:int a4=0,1,2,3,*p;p=&
20、a2;则*-p的值是【 】,21、若有以下定义和语句: int s23=0,(*p)3; p=s; 则p+1表示数组【】。22、若有定义:int a23=2,4,6,8,10,12; 则a10的值是【 】,*(*(a+1)+0)的值是【 】。23、若有以下定义和语句: int *p3,a6,I; for(i=0;i3;i+) pi=&a2*i;则*p0引用的是a数组元素【 】;*(p1+1)引用的是a数组元素【 】。24、若有定义:int a=2,4,6,8,10,12,14,16,18,20,22,24,*q3,k;则下面程序段的输出是【】。 for (k=0;k3;k+) qk=&ak*4
21、; printf(“%d)n”q23);25、若m数组的元素和它们的值如下所示:数组元素:m0 m1 m2 m3 m4 m5 m6 m7 m8 m9元素中的值: 9 4 12 8 2 10 7 5 1 3则数组元素mm4+m8的值是【 】,*m+m9的值是【 】,m*(m+4)的值是【 】。26、若有以下定义和语句,则下面各个符号的正确含义分别是:(例如对于符号&a21,应该写成:是数组元素a21的地址)。 int a34,(*q)4; q=a; *(q+2): 【 】, *(q+1)+2: 【】, *(*q+2): 【 】27、若有以下定义和语句,在程序中引用数组元素xi的四种形式是: 【】
22、, 【】,【】和【】(假设i已正确说明并赋值)。 int x10,*p; p=x; 28、若有定义:int m106;在程序中引用数组元素mij的四种形式是:【】, 【】,【】和【】 (假设i、j已正确说明并赋值)。29、若有以下定义和语句,在程序中可通过指针数组p,用*(pi+j)等四种形式引用数组元素sij (假设i、j已正确说明并赋值);另三种形式分别是:【】, 【】和【】。 int s106,*p10; for(i=0;i10;i+)pi=si;30、设main函数的说明为:main(int argc,char*argv ),且有命令行为:FILE1 1 2 3(代表回车),则argc
23、的值是【 】, argv1的值是【 】。31、若有以下输入(代表回车),则下面程序的运行结果是【 】。2main()int a23=2,4,6,8,10,12; int (*p)3,i,j; p=a; scanf(“%d,%d”,&i,&j);printf(“a%d%d=%dn”,i,j,*(*(p+i)+j);三、编程1、输入3个整数,按由小到大的顺序输出。2、写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。参考答案一、选择题题号12345678910答案CDCBCACDDD题号11121314151617181920答案BBDDCDCDCC题号2122232425
24、2627282930答案CCCBDCCDDD题号31323334353637383940答案ADCCCCACCA二、填空题1、单元地址 2、基类型 3、Null 4、数组 5、显式类型变换 6、0 1 3 6 7、2 6 6,1 6 6 8、hELLO! 9、bcdABCD 10、1 11、1234512、ef 13、1*0* 14、#9 15、*2*4*6*8* 16、5 17、compuer language18、Ths IS A Test 19、12,12 20、1 21s10的地址 22、8,8 23、a0,a3 24、24 25、8,12,12 26、是数组元意a20地址,是数组元意
25、a12地址,是数组元素a02的值27、*p(p+i), pi, *(x+i), xi 28、(*(m+i)j, *(mi+j) , *(&m00+6*i+j),*(*(m+i)+j) 29、pij (*(p+i)j *(*(p+i)+j) 30、4,1 31、a12=12三、编程题1、main() int n1,n2,n3;int *p1,*p2,*p3;printf(“input three integers n1,n2,n3:”); scanf(“%d,%d,%d”,&n1,&n2,&n3); p1=&n1; p2=&n2; p3=&n3; if(n1n2) swap(p1,p2); if(n1n3) swap(p1,p3); if(n1n3) swap(p2,p3); printf(“now,the order is:%d,%d,%dn”,n1,n2,n3); swap(int *p1,int *p2)int p; p=*p1;*p1=*p2;*p2=p; 2、main()int len;char *str20;printf(“input string:”);scanf(“%s”,str);len=le