C语言指针部分模拟测试题
一、选择题
1.语句int a=10,*point=&a; D   其值不为地址。
A. point  B. &a  C. &point  D.  *point
2.若p为指针变量,y为变量,则y = *p++;的含义是 A     
A.y=*p;p++    B.y=(*p)++    C.y=p;p++    D.p++;y=*p
3.语句char str[]=visual C++;char *p=str;则p的值为 B     
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.下列说明或赋值语句,不正确的是 C     
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],以下正确的是 B   
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;以下语句语法不正确的是 B   
A.p1=&i;  B. p2=&i;  C.p2=&p1;  D.i=’\0x23’;
8.如下图结构体说明和变量的定义,p指向a,q指向变量b.下面不能把结点b连接到结点a之后的语句是  B       
          a                        b
data
next
data
next
A.a.next=q;  B.  p.next=&b; 
C.  p->next=&b;    D.(*p).next=q;
9.下面正确的语句是  A       
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,下列语句中哪一个是正确的 B         
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()时,    B         
A.函数返回值100    B. 函数返回值150
C. 函数返回二个值100和150    D. 语句return 100,150;语法错.
12.数组作为函数的形参时,把数组名作为实参,传递给函数的是
A.该数组的首地址    B. 该数组的元素个数
C. 该数组中的各元素值    D. 该数组的大小
13.执行以下语句序列:则  A         
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.执行以下语句序列:则  C     
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分)下面程序的运行结果为  16          2     
void main( )
{
    static int a[3][2]={{12},{14,16},{1,2}};
    int *p=a[1];
    printf(sizeof 指针%d\n,*(p+1));
printf(%d\n,*(p+3));
}
2.(2*2分=4分)若有以下程序段,则*(*(b+2)+1)的值为  11    , *(*(p+1)+1)的值为  7   
      static  int  b[3][2]={1,3,5,7,9,11};
    int (*p)[2];
    p=b;
3.(1*4分=4分)下面程序的运行结果为    26       
    #include<stdio.h>
    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分)以下程序运行结果_ Hello,world _  ello,world
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分)以下程序运行结果是__121232343454_________
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分) 以下程序运行结果是__200 100_____
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);
}
程序输出的第一行是1  1  第二行是4  1  最后一行是x=10 
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);
    }
}
程序输出的第一行是 111    第二行是  555  最后一行是  343434   
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);
      }
}
程序输出的第一行是j=2 第二行是j=6  最后一行是j=10
三、完善程序
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= p->next )
        if(m> p->data  )m=p->data;
return m;
}
2.(3*2=6分)以下程序求二维数组的平均值
float average(float (*p)[4],int n)
{
float sum=0;
for(int i=0;  i<n  ;i++)
    {for(j=0;j<4;j++)sum+=  (*p)[j] 或 *(*p+j)  ;
    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(score, 3  ));
}
3. (2*3.5=7分)以下程序实现将以L为头指针的链表逆置(设结点个数n>2),即将链表头当链表尾,链表尾当链表头。如下图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。