一.选择题
1.下列程序的输出结果是______。 A
#include
#include
main()
{ char *p1,*p2,s[10]=”12345″;
p1=”abcde”;
p2=”ABCDE”;
strcpy(s+2,p1+3);
strcat(s,p2+2);
printf(“%s”,s);
return;}
A. 12deCDEB.12abcAB C. cdABC45D. abcBDE
2. 以下程序运行之后的输出结果是______。 B
#include
void main()
{ int *p,*p1,*p2,a=3,b=7;
p1=&a; p2=&b;
if(a<b) { p=p1;p1=p2;p2=p; }
printf(“%d,%d “,*p1,*p2);
printf(“%d,%d”,a,b);
}
A. 3,7 7,3 B. 7,3 3,7
C. 7,3 7,3 D. 3,7 3,7
3. 以下函数的功能是______。 B
fun(int *p1,*p2)
{int *p;
*p=*p1;
*p1=*p2;
*p2=*p;}
A. 正确,但没有交换*p1和*p2的值。
B. 使用了空指针,可能造成系统故障。
C. 能成功交换*p1和*p2的值。
D. 能成功交换*p1和*p2的地址。
4. 有以下程序: B
#include
void main()
{ int x[8]={8,7,6,5,0,0},*s;
s=x+3;
printf(“%d\n”,s[2]); }
执行后输出结果是______。
A.随机值 B.0 C.5 D.6
5. 以下程序的输出结果是______。 D
#include
#include
void main()
{ char b1[8]=”abcdefg”,b2[8],*pb=b1+3;
while (–pb>=b1) strcpy(b2,pb);
printf(“%d\n”,strlen(b2)); }
A. 8 B. 3 C. 1 D. 7
6. 若有以下说明: D
int w[3][4]={{0,1},{2,4},{5,8}};
int (*p)[4]=w;
则数值为4的表达式是______。
A. *w[1]+1 B. p++,*(p+1) C. w[2][2] D. p[1][1]
7. 以下程序的输出结果是______。 A
#include
int i;
fun(int a, int *b);
main()
{ int i=1, j=2;
fun(fun(i, &j), &j); return; }
fun(int a, int *b)
{ static int m=2;
i+=m+a;
m=++(*b);
printf(“%d,%d\n”, i, m);
return (m); }
A. 3,3 B. 3,3 C. 3,3 D. 3,3
9,4 6,3 9,3 6,4
6.4
8. 若有语句:int a=4, *p=&a;,下面均代表地址的一组选项是______。 C
A. a,p,&*a B. *&a,&a,*p C. &a,p,&*p D. *&p,*p,&a
9.以下程序的输出结果为______。 C
#include
void main()
{ char s[]=”123″,*p;
p=s;
printf(“%c%c%c\n”,*p++,*p++,*p++); }
A. 123 B. 231 C. 321 D. 312
10.以下程序的输出结果是______。 A
#include
void main()
{ static char s1[]=”programe”,s2[]=”language”;
char *p1,*p2; int i;
p1=s1; p2=s2;
for(i=0;i<8;i++)
if(*(p1+i)==*(p2+i))
printf(“%c”,*(p1+i));
}
A. gae B.ga C. pro D. lang
11.以下定义中与int *p[4]等价的是______。 C
A. int p[4] B. int *p C. int *(p[4]) D. int (*p)[4]
12.以下程序的运行结果是______。 A
#include
void main()
{ char *s=”xcbc3abcd”;
int a, b, c, d;
a=b=c=d=0;
for(; *s; s++)
switch(*s)
{ case ‘c’: c++;
case ‘b’: b++;
default : d++; break;
case ‘a’: a++; }
printf(“a=%d,b=%d,c=%d,d=%d\n”, a, b, c, d); }
A. a=1,b=5,c=3,d=8 B. a=1,b=2,c=3,d=3
C. a=9,b=5,c=3,d=8 D. a=0,b=2,c=3,d=3
13.设char *aa[2]={“abcd”,”ABCD”}; 则以下说法中正确的是______。 C
A. aa数组元素的值分别是”abcd”和”ABCD”。
B. aa是指针变量,它指向含有两个数组元素的字符型一维数组。
C. aa数组的两个元素分别存放的是含有4个字符的一维字符数组首地址。
D. aa数组的两个元素中各自存放了字符’a’和’A’的地址。
14.已知函数定义如下: B
fun (char *p1)
{ char *p2=p1;
while(*p2!= ‘\0’)
p2++;
return (p2-p1); }
在主函数中用语句printf(“%d”,fun(“hello world!”));调用上述函数,则输出结果为______。
A. 13 B.12 C. 11 D. 10
15.若有以下定义:int a[]={1,2,3,4,5,6,7,8,9,10}, *p=a; 表达式的值为3的是______。A
A. p+=2,*(p++) B. p+=2,*++p C. p+=3,*p++ D. p+=2,++*p
16. 以下程序段执行完后,a的值为______。A
static int s[2][4]={0,1,2,3,4,5,6,7};
int a,*p;
p=&s[0][1];
a=(*p)*(*p+3)*(*p+5);
A. 24 B. 15 C. 28 D. 不确定
17设x为一数字字符,则其所对应的十进制数值为______。B
A.x B.x-‘0’ C.*x D.&x
18以下程序中函数scmp的功能是返回形参指针s1和s2所指字符串中较小字符串的首地址,若运行时依次输入:abcd、abba和abc三个字符串,则输出结果为______。B
#include
#include
char *scmp(char *s1, char *s2)
{ if(strcmp(s1,s2)<0)
return(s1);
else return(s2); }
main()
{ int i; char string[20], str[3][20];
for(i=0;i<3;i++) gets(str[i]);
strcpy(string,scmp(str[0],str[1]));
strcpy(string,scmp(string,str[2]));
printf(“%s\n”,string); return;}
A.abcd B.abba C.abc D.abca
19.以下程序的输出结果是______。A
#include
void main()
{ int *p1,*p2,*p,a=7,b=9;
p1=&a;p2=&b;
if(a<b) {p=p1;p1=p2;p2=p;}
printf(“%d,%d “,*p1,*p2);
printf(“%d,%d “,a,b); }
A. 9,7 7,9 B. 7,9 7,9 C. 7,9 9,7 D. 9,7 9,7
20.有以下程序: B
#include
int *f(int *x, int *y)
{ if (*x < *y) return x;
else return y; }
main()
{ int a=7,b=8,*p,*q, *r;
p=&a; q=&b;
r = f(p,q);
printf(“%d,%d,%d\n”,*p,*q,*r); return; }
执行后输出结果是______。
A.7,8,8 B.7,8,7 C.8,7,7 D.8,7,8
21. 已知有以下的说明,那么执行语句a=p+2;后, a[0]的值等于多少______。 D
float a[3]={1.2,45.6,-23.0};
float *p=a;
A. 1.2 B. 45.6 C. -23.0 D. 语句有错
22. 如下程序的执行结果是______。 C
#include
void main()
{ int p1,m1,n1,dv,df;
char *p=”a+b-c+d/e”,c;
p1=m1=n1=dv=df=0;
while ((c=*p++)!=’\0′)
{ switch(c)
{ case ‘+’:p1++;break;
case ‘-‘:m1++;break;
case ‘*’:n1++;break;
case ‘/’:dv++;break;
default:df++; } }
printf(“%d,%d,%d,%d\n”,p1,m1,dv,df); }
A.2,1,0,1 B. 2,1,0,5 C. 2,1,1,5 D. 2,1,1,2
23. 有以下程序: B
#include
void main()
{ int a[3][3],*p,i;
p=&a[0][0];
for(i=0;i<9;i++) p[i]=i+1;
printf(“%d \n”,a[1][2]); }
程序运行后的输出结果是______。
A.3 B.6 C.9 D.2
24.如下程序的执行结果是______。A
#include
void main()
{ int a[3][3]={{2},{4},{6}},i,*p=&a[0][0];
for (i=0;i<2;i++)
{ if (i==0) a[i][i+1]=*p+1;
else ++p;
printf(“%d”,*p); }
printf(“\n”); }
A. 23 B. 26 C. 33 D. 36
25. 已知char s[]=”789″,*p;则执行下列语句后的输出是______。B
p=s;
printf(“%c”,*(p+2));
A.字符’8′ B.字符’9′ C.字符’8′ 的地址 D.字符’9’的地址
二、判断题
1.(对)以下程序:
#include
int fun(int array[],int n)
{ int m=0,i;
for(i=0; i<n; i++) { m+=*array; array++; }
return m; }
main()
{ int a[10]={1,2,3,4,5,6,7,8,9,10};
printf(“fun=%d\n”,fun(a,10)); return; }
其输出结果是1~10的总和。
2.(对)有如下定义:int a[]={1,3,5,7,9}, i, *p ;
则语句:
for(i=0; i<5; i++) printf("a[%d]=%d\t",i,a[i]);
与语句:
for(p=a, i=0; i<5; i++) printf("a[%d]=%d\t",i,p[i]); 等价的。
3.(错)以下程序:
#include
main()
{ int i=10,*p;
p=&i; *p=5;
printf(“%d\n”,i); return; }
输出结果为10。
4.(错)在定义:int *fun();中,标识符fun是一个用于指向函数的指针变量。
5.(错)可通过int *i=NULL; scanf(“%d”,i); 正确进行整数赋值。
6.(错)指针加1表示每次向下移动1个字节。
7.(对)相同类型的指针可以进行减法运算。
8.(错)函数fun(int *p){ return *p; }的返回值是不确定的值。
9.(错)使用指针变量作函数参数采取的是”值传递”的方式。
10.(对)如果数组中每个元素都是具有相同的数据类型的指针,则这种数组称为指针数组。
三、填空题
1.以下程序的执行结果是___12________。
#include
void main()
{ int a[12]={1,2,3,4,5,6,7,8,9,10,11,12},*p[4],i;
for (i=0;i<4;i++) p[i]=&a[i*3];
printf(“%d\n”,p[3][2]); }
2.若有定义:int a[]={2,4,6,8,10,12}, *p=a;则*(p+1)的值是____4_______。
3. 已知有以下的说明,
int a[]={8,1,2,5,0,4,7,6,3,9};
那么a[*(a+a[3])]的值为_____0______。
4. 在C程序中,指针变量的值增1,表示指针变量指向______下一个_____存储单元。
5. 以下程序中,select 函数的功能是:在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标,请填空。row
#include
#define N 3
#define M 3
select(int a[N][M],int *n)
{ int i,j,row=1,colum=1;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(a[i][j]>a[row][colum]){row=i;colum=j;}
*n=______row_____;
return a[row][colum]; }
main()
{ int a[N][M]={9,11,23,6,1,15,9,17,20},max,n;
max=select(a,&n);
printf(“max=%d,line=%d\n”,max,n); return; }
6. 输入10个整数存入一维数组,从中查找某个整数X,查到则输出其是第几个数,查不到则输出“Not Find!”。请填空。
#include
void main ()
{ int a[10],*p=a,x,n,flag=0;
for (;p
scanf (“%d”,&x);
for (n=1,p=a; ______n<=10_____ ;p++,n++)
if (*p==x) {flag = 1;break;}
if (! flag) printf (“Not Find! \n”);
else printf (“%d\n”,n); }
7. 执行以下程序后,输出结果为_564379207816xyz__________。
#include
void main()
{ char *s[6]={“564″,”379″,”207″,”816″,”xyz”,”abc”};
char **p;
int i;
p=s;
for(i=0;i<5;i++)
printf(“%s”,p[i]);
}
8. 一个专门用来存放另一个变量地址的变量叫___指针变量________。
9. 以下程序的执行结果是___ch=f________。
#include
void main()
{ char a[]=”abcdefg”,*p;
p=a;
*(p+3)+=2;
printf(“ch=%c\n”,*(p+5)); }
10. 以下程序的执行结果是______a=100_____。
#include
void main()
{ int a=50,*p;
p=&a;
*p=100;
printf(“a=%d\n”,a); }
11. 以下程序的输出结果是__7_________。
#include
void sub(int *a,int n,int k);
main()
{ int x=0;
sub(&x,8,1);
printf(“%d\n”,x); return; }
void sub(int *a,int n,int k)
{ if(k<=n) sub(a,n/2,2*k);
*a+=k; }
12. mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回。
请填空。
int mystrlen(char *str)
{ int i;
for(i=0; __*(str+i)或str[i]_________!=’\0′;i++); return i; }
13. 以下程序的执行结果是___s=24________。
#include
void main()
{ int a[]={2,3,4},*p,s,i;
s=1;p=a;
for (i=0;i<3;i++) s*=*(p+i);
printf(“s=%d\n”,s); }
14. 执行以下程序段后,a的值为___4________。
static int s[]={5,8,4,6,10,7};
int a,i,*p;
a=10; p=&s[0];
for(i=0;i<6;i++)
a=(*(p+i)
15. 执行以下程序段后,m的值是____6_______。
int a[]={7,4,6,3,10},m,k,*ptr;
m=10;
ptr=&a[0];
for(k=0;k<5;k+=2) m=(*(ptr+k)<m)?*(ptr+k):m;