同步训练7-3答案
一、单项选择题
1在说明语句:int (*p)(char c ,double d);中,下列说法正确是( C )。
    A.*p表示的是指针变量p的值
    B.*p表示的是函数地址
    C.p表示的是函数入口地址
    D.p表示的是函数名
2.以下程序在下划线处,正确的c语言数组最大值最小值调用语句( A )。
int  fun(int *x,int *y)
{………. return 0;}
int main( )
{
int a=10,b=20;
    int (*p)(int *,int *); //定义变量p
p=fun;
          ;
return 0;
}
    A.p(&a,&b);        B.(*p)(*a,*b);
    C.(*p)(a,b);        D.*p(&a,&b);
3在说明语句:int (*p)(char c ,double d);中,int 表示的是( D )。
    A.函数指针变量p类型
    B.函数类型
    C.函数指针变量p所指向的地址中值的类型
    D.函数指针变量p所指向的函数的返回值类型
4.以下程序在下划线处,不正确的调用语句( C )。
int  fun(int *x,int *y)
{……….return 0;}
void pro(int *p1,int *p2,int (*p)(int *,int *))
{  fun(p1,p2);}
int main( )
{
int a=10,b=20;
    int (*p)(int *,int *); //定义变量p
p=fun;
          ;
return 0;
}
    A.(*p)(&a,&b);        B.p(&a,&b);
    C.pro(&a,&b,fun());    D.pro(&a,&b,fun);
5在说明语句:int *p( );中,标识符p代表是( A )。
    A.一个返回值为指针型的函数名
B.一个用于指向整型数据的指针变量
C.一个用于指向一维数组的指针
D.一个用于指向函数的指针变量
填空题
1.以下程序通过函数指针p调用函数fun,请写出定义变量p的语句。
void fun(int *x,int *y)
{ ...... }
int main( )
{
    int a=1,b=2;
  void (*p)(int *,int *)  ;
p=fun; p(&a,&b);
......
}
2.有函数int fun(int *)int Pro (int *,int (*p)(int *)),main ()通过调用函数Pro实现调用函数fun,请把Pro()填写完整
int Pro (int *p,   int (*f)(int *)  )
{
          return f(p)  ;
}
int main()
{
        int a[10]={0};
        Pro( a, fun );
    …….
}
3.若有以下定义和语句则*p[0]引用的数组元素   a[0]  ;*(p[1]+1)引用的是数组元素   a[4] 
    int *p[3],a[9],i;
    for (i=0;i<3;i++) p[i]=&a[3*i];
4.以下程序完成查某个数字数组a中的位置的功能,请填空。
#include <stdio.h>
int *find(int a[ ],int n,int x)
{
    int i=0;
while(i<n&&*a!=x)
  a++  ,i++;
if(i<n)  return a;
else return NULL;
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p,x;
printf("寻哪个数?\n");
scanf("%d",&x);
p=find(a,10,x);
if(p!=NULL) printf("%da[%d]",x,p-a);
return 0;
}
三、程序设计题
1.设计一个函数,出N行M列的二维数组中的最大值和其地址,通过形参传回最大值,而最大值的地址由该函数return语句返回。在主函数中输出数组首址、最大值和其地址。
程序代码:
#include <stdio.h>
#define  N  3
#define  M  3
int *select(int a[N][M],int *n)
{
    int i,j,row=0, colum=0;
        for(i=0;i<N;i++)
            for(j=0;j<M;j++)
                if(a[i][j]>a[row][colum]) 
                {
                    row=i;
                    colum=j;
                }
    *n=a[row][colum];
    return a[0]+row*N+colum;
}
int main( )
{
    int a[N][M]={99,311,423,6,1,15,9,17,20},max,*p;
    p=select(a,&max);
    printf("数组首址=%p,最大值=%d,其地址=%p\n",a[0],max,p);
    return 0;
}
2求M行N列二维数组中的最大值、最小值及所在的下标。所有输入输出在主函数中完成,使用函数指针作为函数参数调用求最大值、最小值的功能函数。
程序代码:
#include <stdio.h>
#define  M  3
#define N  4
void fmax(int a[][N],int *l,int *r)
{
    int i,j;
        for(i=0;i<M;i++)
            for(j=0;j<N;j++)
                if(a[i][j]>a[*l][*r]) 
                {
                    *l=i;
                    *r=j;
                }
}
void fmin(int a[][N],int *l,int *r)
{
    int i,j;
        for(i=0;i<M;i++)
            for(j=0;j<N;j++)
                if(a[i][j]<a[*l][*r]) 
                {
                    *l=i;
                    *r=j;
                }
}
void pro(int a[][N],int *l,int *r,void (*f)(int [][N],int *,int *))
{
    f(a,l,r);
}
int main( )
{
    int a[M][N],i,j,line=0,row=0;
    printf("请输入一个%d行%d列的数组:",M,N);
    for(i=0;i<M;i++)
            for(j=0;j<N;j++)
                scanf("%d",&a[i][j]);
    pro(a,&line,&row,fmax);
    printf("最大值=%d,其下标为%d %d\n",a[line][row],line,row);
    pro(a,&line,&row,fmin);
    printf("最小值=%d,其下标为%d %d\n",a[line][row],line,row);
    return 0;
}

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