函数指针函数指针数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数指针函数指针数组相关的知识,希望对你有一定的参考价值。

参考:百度百科 |函数指针|词条.

指针_函数,就不说了.自己感觉就是So-easy的。[ 声明格式:returnType *Function(arguments); ]

重点是 函数指针,以及突然冒出来的 函数指针数组;(特别说明,我习惯先写代码,再写注释;情况A:代码在左,注释向右。情况B:代码在上,注释在下。)

 

函数指针,我形象的描述 函数<-指针,(文中一切有问题请指正,谢谢)。[声明格式: returnType(*pointer)(arguments); ]

举例: int fun(int x);//声明一个函数;

    int *f(int x)=fun; //声明一个函数指针,并指向fun函数的首地址;

    同样效果的写法: f=&fun; //f是已经定义的函数指针,使用&符号get函数的首地址,但&是可有可无的,为了清晰可以这么写;

注意:1. 赋值的时候,函数fun不带括号和参数,

   2. 函数fun代表函数的首地址,因此讲过赋值后,指针便指向了fun(x)的首位地址。

  ~ 3. 函数括号的形参可有可无,视情况而定

Example:该程序说明了函数指针调用函数的方法:

#include<stdio.h>
int max(int x,int y){return (x>y? x:y);}
int main()
{
    int (*ptr)(int, int);  //声明一个 函数指针*pst,将指向 返回值为int,参数为两个int类型的函数首地址;
    int a, b, c;
    ptr = max;   //将max的首地址赋值给 函数指针 pst;
    scanf("%d%d", &a, &b);
    c = (*ptr)(a,b);  //使用pst调用max函数后将返回值赋值给 变量c
    printf("a=%d, b=%d, max=%d", a, b, c);
    return 0;
}

 ptr是指向函数的指针变量, 所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同 一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指 向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。

不过,在某些编译器中这是不能通过的。这个例子的补充如下,应该是这样的:
 
1.定义函数指针类型:
  typedef int (*fun_ptr)(int,int);
 
2.声明变量,赋值:
 fun_ptr max_func=max;
 
也就是说,赋给函数指针的函数应该和函数指针所指的函数原型是一致的。
Example2:
 1 #include<stdio.h>
 2 
 3 void FileFunc(){
 4     printf("FileFunc\n");
 5 }
 6 void EditFunc(){
 7     printf("EditFunc\n");
 8 }
 9 
10 int main(){
11     typedef void(*funcp)();   
12     
13     funcp pfun=FileFunc;
14     pfun();
15     
16     pfun=EditFunc;
17     pfun();
18 }

 

接下来,是理解 指针函数函数指针的区别:
指针函数:の 返回值是指针的函数. 实际本质还是一个函数。函数除了void外都有返回类型,而这个函数指针的意思是 返回类型是某一类型的指针。
定义格式:返回类型标识符*函数名称(形式参数表){ /*...*/}
 
     返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,
该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”
来个Example3:
 1 #include<iostream>
 2 using namespace std;
 3 int main(){
 4     float*find(float(*p)[4],intm);//查询序号为m的学生的四门课程的成绩
 5     float score[][4]={{50,51,52,55},{70,70,40,80},{77,99,88,67}};//定义成绩数组,第一维可以为变量
 6     float*pf=NULL;//定义一个指针时一定要初始化
 7     int i,m;
 8 
 9     cout<<"请输入您想查询的学生的序号:";
10     cin>>m;
11     pf=find(score,m);//返回为一维数组指针,指向一个学生成绩
12 
13     for(i=0;i<4;i++)
14         cout<<*(pf+i)<<"";
15     
16     cout<<endl;
17     return 0;
18 }
19 float *find(float(*p)[4],intm){
20     float *pf=NULL;
21     pf=*(p+m);//p是指向二维数组的指针,加*取一维数组的指针
22     return pf;
23 }    
/**学生学号从0号算起,函数find()被定义为指针函数.其形参pointer是指针指向包含4个元素的一维数组的指针变量;
* pf是一个指针变量,它指向float变量。main()函数中调用find()函数,将score数组的首地址传给pointer。
*/

 

最后呢, 函数指针数组:

定义.....我还理解,理解了再写!

 
 
 
 

 

以上是关于函数指针函数指针数组的主要内容,如果未能解决你的问题,请参考以下文章

指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数

帮你捋值复杂指针(指针数组,数组指针 函数指针,函数指针数组)

指针数组,数组指针指针函数,函数指针

函数指针函数指针数组

指针,数组指针,指针数组,函数指针解析

指针,数组指针,指针数组,函数指针解析