一.选择题

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;