中午好 ,今天是: 2024年11月22日
|
|
|
|
|
|
 
单元练习
第1章 C语言程序设计基本知识
第2章 算法及其描述
第3章 数据类型及表达式
第4章 结构化程序设计
第5章 数组
第6章 函数与预处理
第7章 指针
第8章 结构体、共用体和枚举类型
第9章 位运算
第10章 文件
模拟测试
模拟测试一
模拟测试二
模拟测试三
第7章 指针
发布人:
陈裕雄
一、 单项选择题
1.设有定义:int  n1=0,n2,*p=&n2,*q=&n1; 以下赋值语句中与n2=n1;语句等价的是(   ) 。
A.*p=*q;  B.p=q;   C.*p=&n1;   D.p=*q; 

2.若有定义:int  x=0, *p=&x;,则语句printf("%d\n",*p);的输出结果是(  )。
A.随机值  B.0   C.x的地址   D.p的地址

3. 以下定义语句中正确的是(  )。
A. char a='A'b='B';     B. float a=b=10.0;
C. int a=10,*b=&a;      D. float *a,b=&a; 

4. 有以下程序 
    main()
    { int a=7,b=8,*p,*q,*r;
      p=&a;q=&b;
      r=p; p=q; q=r;
      printf("%d,%d,%d,%d\n",*p,*q,a,b);
    }
    程序运行后的输出结果是(  )。
 A. 8,7,8,7   B. 7,8,7,8   C. 8,7,7,8   D. 7,8,8,7 

5. 设有定义:int a,*pa=&a;以下scanf语句中能正确为变量a读入数据的是(  )。
  A. scanf(“%d”, pA) ;     B. scanf(“%d”, A) ;
  C. scanf(“%d”,& pA) ;    D. scanf(“%d”,* pA) ;

6. 设有定义:int n=0,*p=&n,**q=&p;则以下选项中,正确的赋值语句是(  )。
   A.p=1;    B.*q=2;    C.q=p;    D.*p=5;

7. 有以下程序
    void  fun(char  *a,  char  *b)
    {  a=b;    (*A)++;  }
    main ()
    { char   c1=’A’, c2=’a’, *p1, *p2;
    p1=&c1;  p2=&c2; fun(p1,p2);
    printf(“%c%c\n”,c1,c2);
    }
    程序运行后的输出结果是(  )。
 A. Ab        B. aa        C. Aa           D. Bb

8. 若程序中已包含头文件stdio.h,  以下选项中,正确运用指针变量的程序段是(  )。
  A. float  *i=NULL;                      B. float a,*f=&a;
     scanf("&d",f);                        *f=10.5;
  C. char  t=’m’, *c=&t;                D. long   *L;
     *c=&t;                                  L=\0;

9. 有以下程序
    #inc1ude   <stdio.h>
    main()
    {  printf("%d\n", NULL);  }
    程序运行后的输出结果是(  )。
    A. 0          B. 1            C. -1          D. NULL没定义,出错

10. 已定义以下函数:
    fun (int   *p)
    {  return   *p;  }
    该函数的返回值是(  )。
    A. 不确定的值                          B. 形参p中存放的值
    C. 形参p所指存储单元中的值     D. 形参p的地址值

11. 下列函数定义中,会出现编译错误的是(  )。
    A.void max(int  x, int  y,int  *z)   B. int  max(int   x,y)
    { *z=x>y  ? x:y;  }                       { int  z ;
                                                z=x>y  ? x:y;
                                                return  z ;
                                              }
   C. max (int  x,int  y)                D. int  max(int  x,int  y)
    {  int   z;                               {   return(x>y?x:y) ; }
       z=x>y?x:y;  return(z);
    }

12. 有以下程序段:
    main()
    { int  a=5,  *b,   **c;
    c=&b;   b=&a;
    ……
    }
    程序在执行了c=&b:b=&a;语句后,表达式:**c的值是(  )。
    A. 变量a的地址  B. 变量b中的值 C. 变量a中的值  D. 变量b的地址

13. 有以下程序:
    main()
    { char a,b,c,*d;
     a=’\’;  b=‘\xbc’;
     c=‘\0xab’;  d="\017";
     print("%c%c%c\n",a,b,c,*d);
    }
    编译时出现错误,以下叙述中正确的是(  )。
    A. 程序中只有a=’\’;语句不正确 B. b=‘\xbc’;语句不正确
    C. d="\017";语句不正确                D. a=’\’;和c=‘\0xab’;语句都不正确

14. 若有以下定义和语句:
    #include    <stdio.h>
    int a=4,b=3,*p,*q,*w;
    p=&a;  q=&b;  w=q;  q=NULL;
    则以下选项中错误的语句是(  )。
    A. *q=0;   B. w=p;   C. *p=a;  D. *p=*w;

15. 有以下程序:
#include <stdio.h>
int *f(int *x,int *y)

     if(*x<*y)
        return x;
     else
        return y;
  }
 void main()
 {
     int a=7,b=8,*p,*q,r;
     p=&a;
     q=&b;
     r=*f(p,q);
     printf("%d ,%d,%d\n ",a,b,r);
  }
    程序运行后输出结果是(  )。
    A. 7,8,8    B. 7,8,7   C. 8,7,7   D. 8,7,8

16. 若有说明:int n=2,*p=&n,*q=p;,则以下非法的赋值语句是(  )。
    A. p=q;    B. *p=*q;  C. n=*q;  D. p=n;

17. 有以下程序:
    void fun(char *c,int d)
    {   *c=*c+1;d=d+1;
        printf(“%c,%c,”,*c,d);
    }
    main()
    {   char a=’A’,b=’a’;
        fun(&b,A);  printf(“%c,%c\n”,a,b);
    }
    程序运行后的输出结果是(  )。
    A.B,a,B,a      B. a,B,a,B     C. A,b,A,b     D. b,B,A,b

18. 若有说明语句:int  a,b,c,*d=&c;,则能从键盘读入三个整数分别赋给变量a、b、c的语句是(  )。
    A. scanf("%d%d%d",&a,&b,d);    B. scanf("%d%d%d",&a,&b,&d);
    C. scanf("%d%d%d",a,b,d);      D. scanf("%d%d%d",a,b,*d);

19. 若定义:int a=511,*b=&a;, 则printf("%d\n",*b);的输出结果为(  )。
     A. 无确定值     B. a的地址     C. 512       D. 511

20. 若有说明:int  i, j=2,*p=&i;,则能完成i=j赋值功能的语句是(  )。
     A. i=*p;    B.  p*=*&j;  C. i=&j;   D. i=**p;

二、填空题
1. 有以下程序
    void f( int y,int *x)
    {y=y+*x;  *x=*x+y;}
    main( )
    {  int x=2,y=4;
       f(y,&x);
       printf(“%d   %d\n”,x,y);
    }
    执行后输出的结果是______ 。 

2. 下面程序的运行结果是______ 。
    void swap(int *a,int *b)
    {  int  *t;
       t=a;   a=b;  b=t;
    }
    main()
    {  int  x=3,y=5,*p=&x,*q=&y;
       swap(p,q);
       printf(“%d%d\n”,*p,*q); 
    } 
 
3. 设有以下程序:
    main()
    {   int   a, b, k=4, m=6, *p1=&k, *p2=&m;
        a=pl=&m;
        b=(*p1)/(*p2)+7;
        printf(“a=%d\n”,A);
        printf(“b=%d\n”,b);
    }
    执行该程序后,a的值为______ ,b的值为______ 。   

 4. 下列程序的输出结果是 ______ 。
    void fun(int *n)
    {  while( (*n)--);
          printf(“%d”,++(*n));
    }
    main()
    {  int  a=100;
       fun(&A);
    }

5. 以下函数用来求出两整数之和,并通过形参将结果传回,试完整程序。
    void func(int x,int y, ______ z)  
    {   *z=x+y;   }

6. 函数 void fun(float  *sn, int n)的功能是:根据公式s=1-1/3+1/5-...1/(2n+1)计算S,计算结果通过形参指针sn传回;n通过形参传入,n的值大于等于0。试完整程序。   
          void  fun( float *sn, int n)
             {  float  s=0.0, w, f=-1.0;
                int i=0;
                for(i=0; i<=n; i++)
                { f=______* f;
                  w=f/(2*i+1);
                  s+=w;
                }
                 ______=s;
             }

7. 以下函数的功能是,把两个整数指针所指的存储单元中的内容进行交换,试完整程序。  
         exchange(int  *x,  int  *y)
         {  int t;
            t=*y;   *y= ______  ;    *x=  ______ ;
         }

8. 下面函数要求用来求出两个整数之和,并通过形参传回两数相加之和值,试完整程序。   
       int add(int x,int y,  ______ z)
{  ______ =x+y;}

三、程序设计题
1. 编写一个函数,将数组中n个数按反序存放。
2. 用地址法输入输出二维数组各元素。
3. 用指针法输入输出二维数组各元素。
答案:
1.单项选择题
    1) A  2)B    3)C   4)C    5)A  6)D   7)A   8)D   9)A  10)C
    11)B  12)C   13)D  14)A  15)B  16)D  17)D  18)A  19)D  20) B
   
2.填空题
    (1) 8   4     (2) 3  5    (3) 0     (4) 7    (5) 0
    (6) int *     (7) –1     (8) *sn   (9) *x   (10) t
    (11) int *    (12) *z

3.程序设计题
(1) 编写一个函数,将数组中n个数按反序存放。
void inv(int *x,int n)
 {   int *p,m,t,*i,*j;
        m=(n-1)/2;
        i=x; j=x+n-1; p=x+m;
        for(;i<=p;i++,j--)
        { t=*i; *i=*j; *j=t ;}
      return;
 }
 main()
 {  int i,arr[10],*p=arr;
    printf("The original array : \n");
    for(i=0;i<10;i++,p++)
         scanf("%d",p);
    printf("\n");
    p=arr;  /*  pay attention to reassigning for p */
    inv(p,10);
    printf(" The array has been inverted :\n");
    for(p=arr;p<arr+10;p++)
        printf("%d",*p);
    printf("\n");
 }

 (2) 用地址法输入输出二维数组各元素。
#include <stdio.h>
main( )
{
    int a[3][4];
    int i,j;
    for(i = 0; i<3; i++)
       for(j = 0; j<4; j++)
          scanf("%d",a[i]+j); / *地址法* /
    for(i = 0; i<3; i++)
    {
         for(j = 0; j<4; j++)
             printf("%4d",*(a[i]+j)); /* *(a[i]+j) 是地址法所表示的数组元素* /
         printf(" ");
    }
}
运行程序:
1 2 3 4 5 6 7 8 9 10 11 12
1   2   3   4
5   6   7   8
9  10  11  12

(3) 用指针法输入输出二维数组各元素。
#include<stdio.h>
main( )
{
    int a[3][4],*ptr;
    int i,j;
    ptr = a[0];
    for(i = 0; i<3; i++)
       for(j = 0; j< 4; j++)
            scanf("%d", ptr++); / *指针的表示方法* /
    ptr = a[0];
    for(i = 0; i<3; i++)
    {
        for(j = 0; j<4; j++)
             printf("%4d", *ptr++);
        printf(" ");
    }
}
运行程序:
1 2 3 4 5 6 7 8 9 10 11 12 
1   2   3   4
5   6   7   8
9  10  11  12
 

Copyright©2012,All Rights Reserved
版权所有:广东南方职业学院计算机系 设计:陈裕雄