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

C语言学习笔记

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

  指针的就是一块存放地址的变量,这个变量会指向实际的值,指针的做用不光指向变量,它一样能够指向函数。ide

一:指向函数的指针

 1. 函数的指针

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

 这个过程的实现,通常能够分三个步骤:学习

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

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

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

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

先来看一下通常函数的调用法get

#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;
}

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

#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;
}

 能够看出两个程序的运行结果是同样的

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);
}

二:返回指针值的函数

 指针可以指向函数,那么函数一样也能返回指针类型的返回值。

 通常形式为:

     类型名   *函数名(参数)  好比: 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;
}

相关文章
相关标签/搜索