C语言学习笔记

 之 指向函数的指针与返回指针值的函数

  指针的就是一块存放地址的变量,这个变量会指向实际的值,指针的作用不光指向变量,它同样可以指向函数。

一:指向函数的指针

 1. 函数的指针

    函数在编译过程中会被分配一个入口函数,也就是首地址,这个入口地址就是函数的指针。就像数组名作为数组首地址一样,C语言规定函数名也作为函数首地址。这个首地址给一个特定的指针变量,那么这个指针变量就指向了这个函数,通过这个指针变量可以实现函数的调用。

 这个过程的实现,一般可以分三个步骤:

1.定义指向函数的指针变量

2.将指针变量指向某函数

3.利用指针函数的指针变量调用函数

我们以一个实例来说明一下:(输入10个数,求其中的最大值)

先来看一下一般函数的调用法

#include <stdio.h>
int max(int *p); //声明函数
main()
{
   int i,m,a[10];
   printf("请输入10个数\n");
   for(i=0;i<10;i++)
       scanf("%d",&a[i]);
   m=max(a);//调用函数,a是数组名代表数组首地址,也就是a[0]
   printf("max=%d\n",m);
}
int max(int *p)//函数,*p是定义指针变量p,*号并无实际意义,此时的p=a;
{
   int i,t=*p;
   for(i=1;i<10;i++)
   {
       if(*(p+i)>t)
           t=*(p+i);
   }
   return t;
}

C语言学习笔记【指针03】指向函数的指针与返回指针值的函数_C语言 指针  指向函数的指针与返回指针

  基本明白了整个流程之后,我们再来用指向函数的指针调用的方法:

#include <stdio.h>
int max(int *p); //声明函数
main()
{
   int i,m,a[10],max;
   int (*f)();            //定义指向函数的指针变量f
   printf("请输入10个数\n");
   for(i=0;i<10;i++)
       scanf("%d",&a[i]);
   f=max;              //指针变量指向函数max
   m=(*f)(a);           //调用函数,(*f)代表函数max
   printf("max=%d\n",m);
}
int max(int *p)//函数,*p是定义指针变量p,*号并无实际意义,此时的p=a;
{
   int i,t=*p;
   for(i=1;i<10;i++)
   {
       if(*(p+i)>t)
           t=*(p+i);
   }
   return t;
}

C语言学习笔记【指针03】指向函数的指针与返回指针值的函数_C语言 指针  指向函数的指针与返回指针_02

 可以看出两个程序的运行结果是一样的

2.指向函数的指针作函数参数

 用指向函数的指针作函数参数时,在函数调用时把某几个函数的首地址传递给被调用函数,使被传递的函数在被调用的函数中调用。比如:

主调函数
p1=max; //函数p1,设有两个参数
p2=min; //函数p2,设有两个参数
....
inv(p1,p2);//把函数名作为首地址给被调函数DemoInv
被调函数
/*接受函数参数,定义指针x1和x2,p1传递给x1,p2传递给了x2*/
DemoInv(int (*x1)(int,int),(*x2)(int,int))
{
   ...
  y1=(*x1)(a,b);//相当于计算函数p1
  y2=(*x2)(a,b);
}

程序实例

#include<stdio.h>
/*
  函数声明
*/
int max(int x,int y);
process(int x,int y,int (*fun)(int,int));
main()
{
   /*函数作为实参的声明*/
   int min(int,int);
   int max(int,int);
   int add(int,int);
   int a,b;
   printf("输入2个数字\n");
   scanf("%d,%d",&a,&b);
   /*函数作为实参传递*/
   printf("min=");
   /*
     将a和b传递给北调函数process中的x和y
     再将函数min作为地址传递给fun
   */
   process(a,b,min);
   printf("max=");
   process(a,b,max);
   printf("add=");
   process(a,b,add);
}
/*计算最小值*/
int min(int x,int y)
{
   int z;
   z=((x<y)?x:y);
   return z;
}
/*计算最大值*/
int max(int x,int y)
{
   int z;
   z=((x>y)?x:y);
   return z;
}
/*计算两个数的和*/
int add(int x,int y)
{
   int z;
   z=x+y;
   return z;
}
/*
   被调函数,此时的fun指向了各个函数(max,min,add)
*/
process(int x,int y,int (*fun)(int,int))
{
   int result;
   result=(*fun)(x,y);// 相当于执行max(x,y),min(x,y),add(x,y);
   printf("%d\n",result);
}

C语言学习笔记【指针03】指向函数的指针与返回指针值的函数_C语言 指针  指向函数的指针与返回指针_03

二:返回指针值的函数

 指针能够指向函数,那么函数同样也能返回指针类型的返回值。

 一般形式为:

     类型名   *函数名(参数)  比如: int *fun(int x,int y)

程序实例

#include<stdio.h>
/*
  函数声明
*/
int *fun(int x,int y);
main()
{
   int *fun(int,int); //为p=fun(i,j)声明函数fun
   int *p,i,j;
   printf("请输入两个数字:\n");
   scanf("%d,%d",&i,&j);
   p=fun(i,j);//将函数fun的变量地址给指针变量p,
   printf("max=%d\n",*p);//输出值
}
/*
   函数fun的计算结果是地址
   *fun相当于定义了一个指针变量,只不过在这儿fun是函数,也就是指针函数
*/
int *fun(int x,int y)
{
  int *z;
  if(x>y)
      z=&x;//返回地址
  else
      z=&y;
  return z;
}

C语言学习笔记【指针03】指向函数的指针与返回指针值的函数_C语言 指针  指向函数的指针与返回指针_04