第七章指针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完全一样了,都指向一个数2B)把q中数据个pC)把q中数据给aD)a中数据是2,不能够给一个地址。除非*q=a2.若定义:inta=511,*b=&a;,则printf(%d\n,*b);的输出结果为:DA.无确定值B.a的地址C.512D.511inta=511,*b=&a;a是整形变量b是整形指针变量,指向aprintf(%d\n,*b);就是输出指针变量b,所指变量的值输出结果5113.已有定义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*K4.变量的指针,其含义是指该变量的(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,*pC.*&p,*p,&aD.&a,&*p,pint*p是定义一个指针,p=&a,p指向a的地址,*p=a,*指针名是指取该指针所指地址中的内容,&a为a的地址,&*p=&a,p中放的为a的地址8.若需要建立如图所示的存储结构,且已有说明double*p,x=0.2345;则正确的赋值语句是()。BA.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=a10.有如下语句: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)。0.2345pxmpnqpmqn#includestdio.hmain(){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.下面程序的功能是从输入的十个字符串中找出最长的那个串。请在________处填空。#includestdio.h#includestring.h#defineN10main(){chars[N][81],*t;intj;for(j=0;jN;j++)gets(s[j]);t=*s;for(j=1;jN;j++)if(strlen(t)strlen(s[j]))___A_____;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]=boy14.设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.716.以下不能正确进行字符串赋初值的语句是(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)。#includestdio.hmain(){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*=nC.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)。#includestdio.hmain(){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)+327.不合法的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变量中存放