文档库 最新最全的文档下载
当前位置:文档库 › C语言指针测试题(实验)

C语言指针测试题(实验)

C语言指针部分模拟测试题

一、选择题

1.语句int a=10,*point=&a;其值不为地址。

A. point

B. &a

C. &point

D. *point

2.若p为指针变量,y为变量,则y = *p++;的含义是

A.y=*p;p++ B.y=(*p)++ C.y=p;p++ D.p++;y=*p 3.语句char str[]=”visual C++”;char *p=str;则p的值为

A. ”visual C++”

B.str的首地址

C. \n

D.”v”

4.设有说明语句char *s[]={“student”,”Teacher”,”Father”,”Month”}, *ps=s[2];执行语句:printf(“%c,%s,%c”,*s[1],ps,*ps);则输出

A.T,Father,F

B.Teaher,F,Father

C. Teacher,Father,Father

D.语法错,无输出

5.下列说明或赋值语句,不正确的是

A. char *p;p=”Visual C++”;

B. char p1[12]={…v?,?i?,?s?,?u?};

C. char p2[12];p2=”Visual C++”

D. char p3[]=”Visual”;

6.现有int b[3][4],*p;p=(int *)b;若要指针p指向b[2][3],以下正确的是

A.p+=3*4+3

B.p+=2*4+3

C. p+=(3*4+3)*sizeof(int)

D.p+=(2*4+3)*sizeof(int)

7.语句int i,*p1,**p2;以下语句语法不正确的是

A.p1=&i;

B. p2=&i;

C.p2=&p1;

D.i=?\0x23?;

8.如下图结构体说明和变量的定义,p指向a,q指向变量b.下面不能

..把结点b连接到结点a之后的语句是

C. p->next=&b;

D.(*p).next=q;

9.下面正确的语句是

A. int a[3][4],(*p)[4]; p=a;

B. int a[3][4],*p[4]; p=a;

C. int a[3][4],*p; p=a;

D. int a[3][4],**p;*p=a;

10.以“追加”方式打开文本文件a:\aa.dat,下列语句中哪一个是正确的是

A.fp=fopen("a:\\aa.dat","ab");

B. fp=fopen("a:\\aa.dat","a");

C. fp=fopen("a:\\aa.dat","r+");

D. fp=fopen("a:\\aa.dat","w");

11.设有函数定义:int f1(void){return 100,150;}调用函数f1()时,

A.函数返回值100

B. 函数返回值150

C. 函数返回二个值100和150

D. 语句return 100,150;语法错.

12.数组作为函数的形参时,把数组名作为实参,传递给函数的是

A.该数组的首地址

B. 该数组的元素个数

C. 该数组中的各元素值

D. 该数组的大小

13.执行以下语句序列:则

enum {Sun,Mon,Tue,Wed,Thu,Fri,Sat}c1,c2; //A

c1=Mon; //B

printf(“%d”,c1);

A.输出1

B.输出2

C.输出0

D. B行语法错

14.执行以下语句序列:则

char *p1=”Speaking”; //A

char *p2=”English”; //B

char *p3=”a piece of cake”; //C

char *str[]={p1,p2,p3}; //D

printf(“%c”,*(str[0]+1));

A.输出English

B.输出Speaking

C.输出p

D. D行语法错

二、填空题

1.(2*2分=4分)下面程序的运行结果为、

void main( )

{

static int a[3][2]={{12},{14,16},{1,2}};

int *p=a[1];

printf(“%d\n”,*(p+1));

printf(“%d\n”,*(p+3));

}

2.(2*2分=4分)若有以下程序段,则*(*(b+2)+1)的值为,

*(*(p+1)+1)的值为7

static int b[3][2]={1,3,5,7,9,11};

int (*p)[2];

p=b;

3.(1*4分=4分)下面程序的运行结果为

#include

void sub(int *x,int i,int n)

{

if(n<=i)sub(x,i,3*n);

*x+=n++;

}

void main( )

{

int x=0;

sub(&x,12,2);

printf(“%d”,x);

}

4.(2*2分=4分)以下程序运行结果为_ _、void main()

{

char *p,*q;

char str[]="Hello,World\n";

q = p = str;

p++;

printf(“%s\n”,q);

printf(“%s\n”,p);

}

5. (1*4分=4分)以下程序运行结果是__ ________ void main()

{

short ar[5]={1,2,3,4,5 };

short * par=&ar[1];

int i;

for(i=0; i<4; i++)

{

printf(“%d %d %d”,ar[i],par[i],*(ar+i));

}

}

6.(2*2分=4分) 以下程序运行结果是__ _____ void swap2(int *x,int *y)

{int t;

t=*x;*x=*y;*y=t;

}

void main( )

{ int a=100,b=200;

swap2(&a,&b);

printf(“%d\t%d”,a,b);

}

7.(3*2分=6分)

void fun(int n, int *s)

{ int f1,f2;

if(n= =1||n= =2)*s=1;

else{fun(n-1,&f1);fun(n-2,&f2);*s=2*f1+f2+1;

printf(“%d\t%d”,f1,f2);}

}

void main( )

{ int x;

fun(4,&x);

printf(”x=%d\n”,x);

}

程序输出的第一行是第二行是最后一行是8. (3*2分=6分)

void f(int *q1,int *q2,int *q3)

{*q3=*q1+*q2;}

void main( )

{ int i,j,a[3][3]={1,1},*p1=a[0],*p2=a[0]+1,*p3=a[0]+2;

for(i=2;i<9;i++)f(p1++,p2++,p3++);

for(i=0;i<3;i++)

{ for(j=0;j<3;j++)printf(“%d”,a[i][i]);

printf(?\n?);

}

}

程序输出的第一行是第二行是最后一行是9.(2*3分=6分)

int f(int x,int y)

{return x*y;}

void main( )

{ int i,j,(*fun)(int,int);

fun=f;

for(i=1;i<4;i++)

{ switch(i)

{case 1:

case 2: j=(*fun)(i,i+1);break;

case 3: j=(*fun)(i-1,i+2);break;

}

printf(”j=%d”,j);

}

}

程序输出的第一行是 第二行是 最后一行是

三、完善程序

1.(2*3分=6分)以下min 函数的功能是:在非空单向链表中查找结点数据域为最小的值,并作为函数返回值.链表如下.

struct NODE{int data;NODE *next;};

int min(NODE *first)

{

NODE *p;

int m;

p=first;

m=p->data;

for(p=p->next;p!=NULL;p= )

if(m> )m=p->data;

return m;

}

2.(3*2分=6分)以下程序求二维数组的平均值

float average(float (*p)[4],int n)

{

float sum=0;

for(int i=0; ;i++)

{for(j=0;j<4;j++)sum+= ;

p++;

}

return sum/(n*4);

}

void main( )

{ float score[3][4]={{56,65,70,76},{89,97,52,81},{90,99,91,86}};

printf(”平均值=%f ”,average( ));

}

3. (2*3.5分=7分)以下程序实现将以L 为头指针的链表逆置(设结点个数n>2),即将链表头当链表尾,链表尾当链表头。如下图:

head L

L

提示:本算法的思想是,逐个地把L的当前结点q插入新的链表头部,p为新表表头.

void reverse(NODE * L)

{

p=L->next;

q=p->next;

;

while(q!=NULL)

{

p->next=L;

L=p;

p=q;

;

}

p->next=L;L=p;

}

4. (3*2分=6分)以下程序实现链表L中删除第i个元素(设1≤i≤元素个数) void Delete(NODE *L,int i)

{NODE *p,*q;

if(i= =1) {q=L;L=L->next; } //删除第一个元素

else

{

p=L;

while(--i>1) ;

q=p->next;

; //删除第i个元素

}

;

}

5. (4*2.5分=10分)设链表上结点的数据结构定义如下:

struct PNODE{

int x;

PNODE *next;

};

设已建立了一条链表,h为链表首指针。函数DelAdd的功能为:若链表上能找到结点的x值为value,则从链表上删除该结点(假设链表上各个结点值是

不同的);否则构造一个新结点,其x 的值为value,并将新结点插入链尾。该函数要返回链表的首指针。

PNODE *DelAdd(PNODE *h, int value)

{

PNODE *p1, *p2;

int flag=0; //值为1时,表示已删除值为value的结点p1=h;

while(p1 && flag= =0)

{ if(p1->x= =value)

{ flag=1;

if(p1= =h){h= ; free( p1); }

else{p2->next= ; free( p1);}

}

else {p2=p1; p1= ;}

}

if(flag= =0)

{

p1=(PNODE *)malloc(sizeof (PNODE));

p1->x=value;

p1->next=0;

if(h= =0) h=p1;

else ;

}

return h;

}

相关文档
相关文档 最新文档