1对于同类型的指针变量
1.对于同类型的指针变量,不可能进行的运算是( )。
A.- B.= C.+ D.==
2.下列不正确的定义是( )。
A.int *p=&i,i; B.int *p, i; C.int i, *p=&i;
D.int t, *p;
3.下列正确的定义是( )。
A.int x=3,*p=1; B.int x=3,*p; C.int x=3,*p=x;
D.int *p=&x=3;
4. 下列语句定义p为指向float类型变量d的指针,其中哪一个是正确的( )。
A、float d,*p=d; B、float d,*p=&d; C、float *p=&d,d; D、float d,p=d;
5. 对语句“int a[10],*p=a;”,下列表述中哪一个是正确的( )。
A、*p被赋初值为a数组的首地址 B、*p被赋初值为数组元素a[0]的地址
C、p被赋初值为数组元素a[1]的地址 D、p被赋初值为数组元素a[0]的地址
6.设有定义 int a=1,b,*p=&a; 则下列语句中使b不为a的语句是( )。
A.b=*&a; B.b=*p; C.b=a; D.b =*a; 7. p1指向某个整型变量,要使指针p2也指向同一变量,哪一个语句是正确的( )。
A、p2=p1; B、p2=**p1; C、p2=&p1; D、p2=*p1; 8. 假如指针p已经指向变量x,则&*p相当于( )。
A、x B、*p C、&x D、**p 9. 假如指针p已经指向某个整型变量x,则(*p)++相当于( )。
A、p++ B、x++ C、*(p++) D、&x++ 10.设指针x指向的整型变量值为25,则printf(“%d\n”,++*x);的输出是( )。
A.23 B.24 C.25 D.26 11.若有说明:int i, j=7,*p=&i; 则与 i=j;等价的语句是( )。
A.i=*p; B.*p=*&j; C.i=&j; D.i=**p; 12. 若有说明:char ch, *p; 则p不能正确获得值的语句是( )。
A.*p=getchar( ); B.p=&ch; scanf(“%c”, p);
C.p=(char *)malloc(1); *p=getchar( ); D.p=&ch; *p=getchar( );
13.若有说明语句int a[ ]={1,2,3,4,5}, *p=a, i; 且0<=i<5, 则对数组元素错误的引用是( )。
A.*(a+i) B.a[p-a] C.p+1 D.*(&a[i]) 14.若有说明语句 int a[5], *p=a; 对数组元素的正确引用是( )。
46
A.*&a[5] B.*p+2 C.*(a+2) D.*a++ 15.若有说明语句 int a[5], *p=a; 对数组元素的正确引用是( )。
A.a[p] B.p[a] C.*(p+2) D.p+2
16.若有以下定义,且0<=i<5, 则对数组元素地址的正确表示是( )。
int a[ ]={1,2,3,4,5},*p=a, i;
A.&(a+i) B.a++ C.&p D.&p[i] 17.下面各语句中,能正确进行赋字符串操作的语句是( )。
A.char s[5] =”ABCDE”; B.char s[5] ={‘A’,‘B’, ‘C’,‘D’,
‘E’};
C.char *s; s=”ABCDE”; D.char *s; scanf(“%s”,&s); 18.若有以下定义,则 *(p+5) 的值为( )。
char s[ ]=”Hello”, *p=s;
A.’0’ B.’\0’ C.’0’的地址 D.不确定的值 19.若有以下的定义,则值为3的表达式是( )。
int a[10] ={1,2,3,4,5,6,7,8,9,10}, *p=a;
A.p+=2,*(p++) B.p+=2,*++p C.p+=3,*p++
D.p+=2,++*p;
20.执行语句 char a[10] ={“abcd”},*p=a 后,*(p+4)的值是( )。
A.”abcd” B.’d’ C.’\0’ D.不能确定 21. 数组定义为“int a[4][5];”,引用“a+3”表示( )。
A、a数组第3列的首地址 B、a数组第0行第3列元素的值
C、a数组第3行的首地址 D、a数组第0列第3行元素的值 22. 数组定义为“int a[4][5];”,引用“a[1]+3”表示( )。
A、a数组第1行第3列元素的地址 B、a数组第1行第3列元素的值
C、a数组第4行的首地址 D、a数组第4列的首地址 23. 数组定义为“int a[4][5];”,引用“*(*a+1)+2”表示( )。
A、a[1][0]+2 B、a数组第1行第2列元素的地址
C、a[0][1]+2 D、a数组第1行第2列元素的值 24. 数组定义为“int a[4][5];”,下列哪一个引用是错误的( )。
A、*a B、*(*(a+2)+3) C、&a[2][3] D、++a 25.若有定义 int a[3][4]; 则对数组元素a[i][j] (0<=i<3,0<=j<4) 正确的引用是( )。
A.*(a+4*i+j) B.*(*(a+i)+j) C.*(a+i)[j] D.a[i] +j 26.若有定义 int a[3][4],*p; 则对数组元素a[i][j](0<=i<3,0<=j<4)正确的引用是( )。
A.p=a B.p=a, *(*(p+i)+j) C.p=a[0], *(p+i*4+j) D.*(*(a+i)+j) 27.若有定义int a[3][4], (*p)[3];则对数组元素a[i][j] (0<=i<3,0<=j<4) 正确的引用是( )。
A.p=a[i] B.p=&a[i][j] C.p=a, *(p+i*4+j) D.p=a, *(*(p+i)+j)
47
28.若有定义int a[3][4], *p, *q[3]; 且0<=i<3,则错误的赋值语句是( )。
A.p=a B.q[i]=a[i] C.p=a[i] D.q[i]=&a[2][0] 29.设有定义语句 int (*ptr)[10]; 其中的ptr是( )。
A.10个指向整型变量的函数指针
B.指向10个整型变量的函数指针
C.一个指向具有10个元素的一维数组的指针
D.具有10个指针元素的一维数组
30.若有以下定义,则数值为4的表达式是( )。
int w [3][4] ={{0,1},{2,4},{0,1},{0,1}}, (*p)[4]=w;
A.* w [1]+1 B.p++, *(p+1) C.w [2][2] D.p[1][1] 31.若有下面的程序片段,则对数组元素的错误引用是( )。
int a[12] ={0}, *p[3], **pp, i;
for(i=0; i<3; i++) p[i]=&a[i*4];
pp=p;
A.pp[0][1] B.a[10] C.p[3][1] D.*(*(p+2)+2) 32.若有如下定义和语句,则输出结果是( )。
int **pp, *p, a=10, b=20;
pp=&p; p=&a; p=&b; printf(“%d,%d\n”, *p, **pp);
A.10, 20 B.10, 10 C.20, 10 D.20, 20 33.若有以下定义和语句,则对w数组元素的非法引用是( )。
int w [2][3], (*pw)[3]; pw=w;
A.*(w [0]+2) B.*pw [2] C.pw [0][0] D.*(pw [1]+2)
1.C语言中,数组名是一个 常量,不能对它进行 和 运算。
由 代表它的首地址。
2.在C程序中,指针变量只能赋 值和 值。 3.在C程序中,可以对指针变量进行 和 来移动指针。
3.单目运算符“*”称为 运算符,“&”称为 运算符。
5.若两个指针变量指向同一个数组的不同元素,可以进行减法运算和 运算。
6.设int a[10], *p=a; 则对a[3] 的引用可以是p[ ] 和 *(p )。
7.若d是已定义的双精度变量,再定义一个指向d的指针变量p的语句是 。
48
8.&后跟变量名,表示 该变量的 ,
*后跟指针变量名,表示 该指针变量 &后指针变量名,表示 该指针变量的 。 9.设有char *a=”ABCD”; , 则printf(“%s”,a);的输出是 ;
而printf(“%c”,*a);的输
出是 。
10. 定义a为共有5个元素的一维整型数组、同时定义p为指向a数组首地址的指针变
量的语句
为 。 11. 定义a为4行5列的二维整型数组、同时定义p为指向a数组首地址的指针变量的
语句
为
。
12.设有以下定义和语句,则 **(p+2) 的值为 。
int a[3][2] ={10,20,30,40,50,60}, (*p)[3];
p=a;
13.以下程序的功能是从键盘上输入若干个字符(以回车键作为结束)组成一个字符
串存入
一个字符数组,然后输出该字符数组中的字符串。请填空。
#include “stdio.h”
#include “ctype.h”
void main( )
{ char str[81],*sptr;
int i;
for(i=0;i<80;i++)
{ str[i] =getchar(); if (str[i] ==’\n’) break; }
str[i] = ; sptr=str;
while(*sptr) putchar(*sptr );
}
14.以下程序从输入的10个字符串中找出最长的那个串及长度。请填空。
#include
#include
void main( )
{ char str[10][80], *sp; int i;
for(i=0;i<10;i++) gets(str[i]);
sp= str[0] ;
for(i=0;i<10;i++)
49
if(strlen(sp)
void main (int argc, char *argv[ ]))
{ while (--argc>0) printf (“%s”, argv [argc]);
printf (“\n”) ;
}
假定上述程序编译连接成目标程序名为p.exe,如果输入如下的命令:
p 123 AAA BBB ? (其中的?表示回车)
命令行中有4个字符串(包括p),: argc=4, argv[0]?p, argv[1]?123, argv[2]?AAA,
argv[3]?BBB。因此, 输出结果是
5. 设有下列程序,试写出运行的结果。
void main( )
{ int i,b,c,a[ ]={1,10,-3,-21,7,13},*pb,*pc;
b=c=1; pb=pc=a;
for(i=0,i<6;i++)
{ if(b<*(a+i)) { b=*(a+i); pb=&a[i]; }
if(c>*(a+i)) { c=*(a+i); pc=&a[i]; }
}
i=*a; *a= *pb; *pb=i; i= *(a+5); *(a+5) = *pc; *pc=i;
printf(“%d,%d,%d,%d,%d,%d\n”,a[0],a[1],a[2],a[3],a[4],a[5]);
}
50
6. 阅读下列程序,写出程序运行的输出结果。
#include
void main( )
{ char *alpha[4] ={″ABCD″,″EFGH″,″IJKL″,″MNOP″};
char *p; int i;
p=alpha[0];
for(i=0;i<4;p=alpha[++i]) printf(″%c″,*(p));
printf(″\n″);
}
7.阅读下列程序,写出程序运行的输出结果。
#include
void main( )
{ static int a[4][4];
int *p[4],i,j;
for(i=0; i<4; i++) p[i] =&a[i][0];
for(i=0; i<4; i++)
{ *(p[i]+i)=1; *(p[i]+4-(i+1))=1; }
for(i=0;i<4;i++)
{ for(j=0;j<4;j++); printf(″%2d″,p[i][j]);
printf(″\n″);
}
}
:
8. 阅读下列程序,写出程序运行的输出结果
#include
void main( )
{ int x=3,y=5;
void p(int *a,int *b);
p(&x,y);
printf(“x=%d,y=%d\n”, x , y);
p(&y, x) ;
printf(“x=%d,y=%d\n”, x , y);
}
void p(int *a, int b)
{ *a=10; b=20;
}
9. 写出下列程序的运行结果
51
#include
int z;
void p(int *x,int y)
{ ++*x; y--; z=*x+y;
printf(“%d,%d,%d\n”, *x, y, z) ;
}
void main( )
{ int x=2 , y=3 , z=4 ;
p(&x , y) ;
printf(“%d,%d,%d\n”, *x, y, z) ;
}
:
1.输入3个整数,按从大到小的次序输出。
2.编一个程序,输入15个整数存入一维数组,再按逆序重新存放后再输出。 3.输入一个字符串,按相反次序输出其中的所有字符。 4.输入一个一维实型数组,输出其中的最大值、最小值和平均值。 5.输入一个3×6的二维整型数组,输出其中最大值、最小值及其所在的行列下标。
6.输入3个字符串,输出其中最大的字符串。
7.输入2个字符串,将其连接后输出。
8.比较2个字符串是否相等。
9.输入10个整数,将其中最大数和最后一个数交换,最小数和第1个数交换。 10.有10个整数,编一程序使它循环后移4个位置,再输出该整数。
52