函数指针用法

函数指针实际上是个指针,只不过这个指针指向一个函数,在调用函数的时候,只要使用指向这个函数的指针就可以了。函数指针声明语法如下:

T (*the_name)([parameter_list]);

the_name便是函数指针的名字,它指向一个函数,返回类型为T,参数列表parameter_list可选,参数列表中只需列出参数类型即可,参数名字可有可无。如下例子:

int (*p_add)(int, int);

p_add这个函数指针指向一个函数,返回类型为int,参数列表是两个int类型的参数。假设有如下函数:

int add(int num1, int num2)

{

    
return num1 + num2;

}

那么,p_add函数指针可以指向add()函数,两者的返回值类型、参数列表必须相同,赋值形式有两种,如下:

p_add = add; //
不使用&

p_add = &add; //
使用&

p_add函数指针使用方法也有两种形式,如下:

int result = p_add(1, 2); //
用法同函数

int result = (*p_add)(1, 2); //
这种用法更像指针

我们还可以用typedef来定义函数指针,如下:

typedef T (*the_name)([parameter_list]);

定义好了之后,就可以直接使用了:

typedef int(*p_func)(int, int);

p_func p_add = add;

p_func p_add = &add;

下面是一个具体的例子:

#include <stdio.h>

int add(int, int);
int minus(int, int);
int multiply(int ,int);
int devide(int , int);

int main(void)
{
    int (*p_add)(int, int);
    int (*p_minus)(int, int);
    p_add = add;
    p_minus = ?
    printf("add:%d\n", p_add(1, 2));
    printf("add:%d\n", (*p_add)(1, 2));
    printf("minus:%d\n", p_minus(3, 4));
    printf("minus:%d\n", (*p_minus)(3, 4));

    typedef int (*p_func)(int, int);
    p_func p_multiply = multiply;
    p_func p_devide = &devide;
    printf("multiply:%d\n", p_multiply(5, 6));
    printf("multiply:%d\n", (*p_multiply)(5, 6));
    printf("devide:%d\n", p_devide(7, 8));
    printf("devide:%d\n", (*p_devide)(7, 8));

    return 0;
}

int add(int num1, int num2)
{
   return num1 + num2;
}

int minus(int num1, int num2)
{
    return num1 - num2;
}

int multiply(int num1, int num2)
{
    return num1 * num2;
}

int devide(int num1, int num2)
{
    return num1 / num2;
}
时间: 2024-11-13 05:30:45

函数指针用法的相关文章

C/C++函数指针用法总结

 C++函数指针 一函数指针介绍 函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关.举例如下: int add(int nLeft,int nRight);//函数定义 该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可: int (*pf)(int,int);//未初始化 则pf可指向int(int,int)类型的函数.pf前面有*,说明pf是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数

剑指offer_面试题14_调整数组顺序使奇数位于偶数前面(函数指针用法)

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 1.一般想法,不考虑时间复杂度: 每次遍历数组,碰到一个偶数就拿出来,将后面所有数字向前挪动一位,在将该偶数放到最后. 2.利用冒泡排序的思想,两个指针,一前以后,如果前为偶数,后为奇数,就交换. 算法如下: void Reorder_array(int p[],int length) { if(NULL == p || length <= 0) return; int i

C语言之函数指针用法总结

一.函数返回指针值 函数是实现特定功能的程序代码的集合,函数代码在内存中也要占据一段存储空间 (代码区内),这段存储空间的起始地址称为函数入口地址.C语言规定函数入口地址为函数的指针,即函数名既代表函数,又是函数的指针(或地址). 1.函数的返回类型可以是指针类型,即函数返回指针值,其定义形式为: 2.函数返回指针值,需要考虑指针有效性的问题,例如:  这个返回有问题,因为它返回的是函数局部变量a的地址值.当函数调用结束后,函数局部变量会释放,变成未知对象.在return语句时,&a还是有效的,

C++中的函数指针用法

代码: 1 #include <iostream> 2 #include <cstdio> 3 typedef void (*FUN)(); 4 using namespace std; 5 void k(){ 6 cout<<"k"<<endl; 7 } 8 int main(){ 9 FUN p = NULL; 10 p = k; 11 (*p)(); //运行程序 12 } 输出: k

深度剖析 函数指针

声明:以下代码全部在windows7  vs2010环境下编译通过,并执行无误. 全局函数指针 是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址. 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数. 函数指针的声明方法: 数据类型标志符(指针变量名)(形参列表): 一般函数的声明为: intfunc ( int x); 而一个函数指针的声明方法为: int (*func) (intx); 前面的那个(*func)中括号是

C++函数指针和指针函数

本文参考http://www.prglab.com/cms/pages/c-tutorial/advanced-data/pointers.php http://blog.csdn.net/ameyume/article/details/8220832 1.函数指针 函数指针是一个指针,其指向的是一个函数,而不是普通的数据类型或者类对象.其定义如下: int (*func)(int a, int b); // 声明函数指针 函数指针的最大作用是将一个函数作为参数传递给另一个函数.函数指针的声明与

C/C++ 函数指针使用总结

一 函数指针介绍 函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关.举例如下: int add(int nLeft,int nRight);//函数定义 该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可: int (*pf)(int,int);//未初始化 则pf可指向int(int,int)类型的函数.pf前面有*,说明pf是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数返回值为int.则p

C++成员函数指针错误用法警示(成员函数指针与高性能的C++委托,三篇),附好多评论

今天做一个成绩管理系统的并发引擎,用Qt做的,仿照QtConcurrent搞了个模板基类.这里为了隐藏细节,隔离变化,把并发的东西全部包含在模板基类中.子类只需注册需要并发执行的入口函数即可在单独线程中执行.最终目标是,继承的业务逻辑类外部调用时有两个接口可选,调用syncRun同步执行:调用由引擎自动生成的asyncRun就异步执行.最终自动生成asyncRun的模板基类没能实现,主要原因是mingw对this处理的太有问题了!!原本以为编译器问题,后来才知道成员函数指针和this指针如此特殊

C中函数指针的用法

理解了C中的声明和指针的话题后再来看函数指针的用法就很容易了. C中函数指针主要有两个用途: 1.作为参数传递给另外一个函数(即作为回调函数) 2.转换表(jump table) 下面分别来介绍作为回调函数的用法和作为转换表的用法 1.回调函数 在链表的查找中使查找函数与类型无关 /*在一个单链表中查找一个指定值的函数.它的参数是一个指向链表第一个节点的指针 * 一个指向我们需要查找的值的指针和一个函数指针,它所指向的函数用于比较存储于链表中的类型的值*/ #include <stdio.h>