一、 选择题
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=10;下面定义不正确的是______ A、 Float s[m]; B、 Float s[m*10]; C、 Float s[m+n];D、 Float s[m+10]; 6、 若有定义int a[]={1,2,0};请问a[a[a[0]]]=______ A、 0 B、1 C、2 D、3
7、 若有char s[10],*p=s;则下面表达式正确的是_____
A、 s=p+s; B、 p=s+10; C、 s[2]=p[4]; D、 p=s[0]; 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},b[3]={1,2,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,下面不能正确执行的赋值语句是( )。
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的值赋于*p 14、若有语句int *point,a=4;和point=&a; 下面均代表地址的一组选项是( )。
A)a,point,*&a B)&*a,&a,*point C)*&point,*point,&a D)&a,&*point,point 15、以下程序输出的结果是( )
void main() { int a=5,*p1,**p2; p1=&a,p2=&p1; (*p1)++;
printf(“%d\\n”,**p2);}
A) 5 B) 4 C) 6 D) 不确定 16、若有说明:int *p,m=5,n; 以下正确的程序段是( )。
A)p=&n; B)p=&n;
scanf(“%d”,&p); scanf(“%d”,*p); C)scanf(“%d”,&n); D)p=&n;
*p=n; *p=m
17、若有说明: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(“%d\\n”,++*x);}
A)23 B)24 C)25 D)26 19、下面判断正确的是( )。
A)char * a=”china”;等价于 char *a;*a=”china”;
B)char str[10]={“china”};等价于char str[10];str[]={“china”}; C)char *s=”china”; 等价于 char *s; s=”china”;
D)char c[4]=”abc”,d[4]=”abc”; 等价于 char c[4]=d[4]=”abc”; 20、设 char *s=”\\ta\\017bc”; 则指针变量s指向的字符串所占的字节数是( )。 A)9 B)5 C)6 D)7
21、下面程序段中,for循环的执行次数是( )。 char *s=”\\ta\\018bc”;
for ( ;*s! =’\\0’;s++) printf(“*”); A)9 B)5 C)6 D)7 22、下面能正确进行字符串赋值操作的是( )。 A) char s[5]={“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=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与s[0]相等 26、下面程序的运行结果是( )。 #include
main()
{char *p1,*p2,str[50]=”abc”;
p1=”abc”; p2=”abc”;
strcpy(str+1,strcat(p1,p2)); printf(“%s\\n”,str);}
A) abcabcabc B)bcabcabc C) aabcabc D)cabcabc 27、下面程序的运行结果是( )。 #include
{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)c 28、下面程序运行结果是( )。 #include
{int i,j; char ts[81];
for(i=0,t=0;p[i]!=’\\0’;i+=2)
if(! isspace(*p+i)&&(*(p+i)!=’a’)) ts[t]=’\\0’; strcpy(p,ts);}
main()
{char str[81]={“a b c d ef g”};
fun(str); puts(str);}
A) abcdeg B)bcde C)ABCDE D)BCDE 29、若有以下定义,则对a数组元素的正确引用是( )。 int a[5],*p=a;
A) *&a[5] B) a+2 C) *(p+5) D)*(a+2) 30、若有以下定义,则对a数组元素地址的正确引用是( )。 int a[5],*p=a;
A) p=5 B)*a+1 C)&a+1 D)&a[0]
31、若有定义:int a[2][3];则对数组a的第i行第j列(假设i,j已正确说明并赋值)
元数值的正确引用为( )。
A)*(*(i+j)+j) B)(a+i)[j] C)*(a+i+j) D)*(a+i)+j
32、若有定义:int a[2][3];则对数组a的第i行第j列(假设i,j已正确说明并赋值)
元数地址的正确引用为( )。 A)*(a[i]+j) B)(a+i) C)*(a+j) D)a[i]+j
33、若有以下定义和语句,则对a数组元素地址的正确引用是( )。 int a[2][3],(*p)[3];
p=a;
A)*(p+2) B)p[2] C)p[1]+1 D)(p+1)+2 34、若有以下定义和语句,则对a数组元素地址的正确引用是( )。 int a[2][3],(*p)[3]; p=a;
A)(p+1)[0] B)*(*(p+2)+1) C)*(p[1]+1) D)p[1]+2 35、若有定义:int a[5];则a数组中首元素的地址可以表示为( )。
A)&a B)a+1 C)a D)&a[1] 36、 若有定义:int (*p)[4];则标识符p( )。
A)是一个指向整型变量的指针 B)是 一个指针数组名
C)是一个指针,它指向一个含有四个整型元素的一维数组 D)定义不合法 37、若有以下定义和赋值语句,则对s数组的第i行第j列(假设i,j已正确说明并赋
值)元素地址的合法引用为( )。
ints[2][3]={0},(*p)[3]; p=s;
A)*(*(p+i)+j) B)*(p[i]+j) C)(p+i)+j D)(*(p+i))[j]
38、若有以下定义和赋值语句,则对b数组的第i行第j列(假设i,j已正确说明并赋
值)元素地址的非法引用为( )。
int b[2][3]={0},(*p)[3]; p=b;
A)*(*(p+i)+j) B)*(p[i]+j)C)(p+i)+j D)(*(p+i))[j] 39、以下与int *q[5];等价的定义语句是( )。
A)int q[5] B)int*q C)int*(q[5]); D)int(*q)[5] 40、设有以下程序段:
char str[4][10]={“first”,“second”,“third”,“fourth”},*strp[4]; int n;
for(n=0;n〈4;n++) strp[n]=str[n];
若k为int型变量且0〈=k〈4,则对字符串的不正确引用是( )。 A)strp B)str[k] C)strp[k] D)*strp
二 、填空题
1、 二级指针是存放一级指针的__________ 2、 指针变量虽然都是存放指针,但____不同
3、 空指针名称是_______,表示没有指针的一种状态 4、 函数名和_______名可以作为指针常量 5、 不同类型的指针变量的赋值必须________
6、以下的运行结果是【 】。 #include
for(I=0;I<4;I++); {k=sub(&I);
printf(“=”,K); }
printf(“\\n”);} sub(int *s)
{static int t=0; t=*s+t;}
7、以下的运行结果是【 】。
#include”string.h” int *P;
main()
{int a=1,b=2,c=3; p=&b;
pp(a+c,&b);
printf(“(!) %d %d %d \\n”,a,b,*p);} pp(inta ,int *b)
{int c=4;
p=*b+c; a=*p-c;