c++的函数指针是怎么用的呀?

c++的函数指针是怎么用的呀?,第1张

函数指针,即指向函数的指针。

1     定义

每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。

2     语法

指向函数的指针变量的一般定义形式为:

数据类型 (指针变量名)(参数表);

3     说明

1) 函数指针的定义形式中的数据类型是指函数的返回值的类型。

2) 区分下面两个语句:

int (p)(int a, int b); //p是一个指向函数的指针变量,所指函数的返回值类型为整型

int p(int a, int b); //p是函数名,此函数的返回值类型为整型指针

3) 指向函数的指针变量不是固定指向哪一个函数的,而只是表示定义了一个这样类型的变量,它是专门用来存放函数的入口地址的;在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。

4) 在给函数指针变量赋值时,只需给出函数名,而不必给出参数。

如函数max的原型为:int max(int x, int y); 指针p的定义为:int (p)(int a, int b); 则p = max;的作用是将函数max的入口地址赋给指针变量p。这时,p就是指向函数max的指针变量,也就是p和max都指向函数的开头。

5) 在一个程序中,指针变量p可以先后指向不同的函数,但一个函数不能赋给一个不一致的函数指针(即不能让一个函数指针指向与其类型不一致的函数)。

如有如下的函数:int fn1(int x, int y); int fn2(int x);

定义如下的函数指针:int (p1)(int a, int b); int (p2)(int a);

p1 = fn1; //正确

p2 = fn2; //正确

p1 = fn2; //产生编译错误

6) 定义了一个函数指针并让它指向了一个函数后,对函数的调用可以通过函数名调用,也可以通过函数指针调用(即用指向函数的指针变量调用)。

如语句:c = (p)(a, b); //表示调用由p指向的函数(max),实参为a,b,函数调用结束后得到的函数值赋给c。

7) 函数指针只能指向函数的入口处,而不可能指向函数中间的某一条指令。不能用(p+1)来表示函数的下一条指令。

8) 函数指针变量常用的用途之一是把指针作为参数传递到其他函数

实例:

#include <iostream>  

using namespace std;  

#include <conioh>  

  

int max(int x, int y); //求最大数  

int min(int x, int y); //求最小数  

int add(int x, int y); //求和  

void process(int i, int j, int (p)(int a, int b)); //应用函数指针  

  

int main()  

{  

    int x, y;  

    cin>>x>>y;  

  

    cout<<"Max is: ";  

    process(x, y, max);  

  

    cout<<"Min is: ";  

    process(x, y, min);  

  

    cout<<"Add is: ";  

    process(x, y, add);  

  

    getch();  

    return 0;  

}  

  

int max(int x, int y)  

{  

    return x > y  x : y;  

}  

  

int min(int x, int y)  

{  

    return x > y  y : x;  

}  

  

int add(int x, int y)  

{  

    return x + y;  

}  

  

void process(int i, int j, int (p)(int a, int b))  

{  

    cout<<p(i, j)<<endl;  

}

你就也定义一个形参中的结构体指针接收传过来的结构体指针就OK啦

形参中的结构体指针改变?这什么意思

给你看个例子吧:

struct node creat(struct node l)

{

struct node head;

head=l;

return head;

}

你是这样吗~

需要。函数式编程是种编程方式,使用指针编写的函数需要让主函数调用,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambdacalculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。

 (一) 用函数指针变量调用函数

  可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例:

1 #include <stdioh>

2 #include <stdlibh>

3

4 int main()

5 {

6 int max(int,int);

7 int (p)(int,int);

8 int a,b,c;

9 p = max;

10 scanf("%d,%d",&a,&b);

11 c = (p)(a,b);

12 printf("a=%d,b=%d,max=%d\n",a,b,c);

13 return 0;

14 }

15

16 int max(int x,int y)

17 {

18 int z;

19 if(x>y) z = x;

20 else z = y;

21 return(z);

22 }

  main函数中的" c = max(a,b); " 包括了一次函数的调用。每一个函数都占用一段内存单元。因此,可以用一个指针变量指向一个函数,通过指针变量来访问它指向的函数。

  第7行:int (p)( int,int ); 用来定义 p 是一个指向函数的指针变量,该函数有两个整形参数,函数值为整形。注意 p 两侧的括号不可省略,表示 p 先与 结合,是指针变量,然后再与后面的 ( ) 结合,表示此指针变量指向函数,这个函数值 (即函数的返回值) 是整形的。如果写成 int p ( int,int ) ,由于( )的优先级高于 ,它就成了声明一个函数P( 这个函数的返回值是指向整形变量的指针)。

  赋值语句 p = max ; 作用是将函数 max 的入口地址赋给指针变量p。和数组名代表数组首元素地址类似,函数名代表该函数的入口地址。这时 p 就是指向函数 max 的指针变量,此时 p 和 max都指向函数开头,调用 p 就是调用 max 函数。但是p作为指向函数的指针变量,它只能指向函数入口处而不可能指向函数中间的某一处指令处,因此不能用 (p + 1)来表示指向下一条指令。

  注意:

  (1) 指向函数的指针变量的一般定义形式为:

  数据类型 (指针变量名)(函数参数列表)

  这里数据类型就是函数返回值的类型

  (2) int ( p) ( int,int ); 它只是定义一个指向函数的指针变量 p, 它不是固定指向哪一个函数的,而只是表示定义这样一个类型的变量,它是专门用来存放函数的入口地址的。在程序中把哪一函数(该函数的值应该是整形的,且有两个整形参数)的地址赋给它,他就指向哪一个函数。在一个函数中,一个函数指针变量可以先后指向同类型的不同函数。

  (3) p = max; 在给函数指针变量赋值时,只需给出函数名而不必给出函数参数,因为是将函数的入口地址赋给 p ,而不涉及 实参和形参的结合问题,不能写成 p = max(a,b);

  (4) c = (p)(a,b) 在函数调用时,只需将( p ) 代替函数名即可,后面实参依旧。

  (5) 对于指向函数的指针变量,像 p++ ,p+n是无意义的。

  (二) 用指向函数的指针作为函数参数

  函数指针变量通常的用途之一就是把指针作为参数传递到其他函数。

  函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量,也可以是指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。

  void sub ( int ( x1) (int), int (x2) (int,int) )

    {

      int a,b,i,j;

      a = (x1)(i);      / 调用 f1 函数 /

      b = (x2)(i)(j);    / 调用 f2 函数 /

    }

  如果实参为两个 函数名 f1 和 f2 在函数首部定义x1、x2为函数指针变量,x1指向的函数有一个整形形参,x2指向的函数有两个形参。i 和 j 是函数f1 和 f2所要的参数。函数sub的形参 x1、x2(指针变量)在函数 sub 未被调用时并不占用内存单元,也不指向任何函数。在sub被调用时,把实参函数 f1 和 f2的入口地址传给形式指针变量 x1 和 x2

  既然在 sub 函数中要调用 f1 和 f2 函数,为什么不直接调用f1 和 f2而要用函数指针变量呢 确实,如果只是用到f1 和 f2 函数,完全可以在sub函数中直接调用f1 和 f2,而不必设指针变量 x1 和 x2。 但是,如果在每次调用sub时,调用的函数不是固定的,下次是f3 和 f4,再是f5 和 f6这时用指针变量就比较方便了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12175513.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存