c :函数指针详解

在研究opencv源代码的过程中,处处可见到函数指针,于是翻出来谭浩强的《C程序设计》把函数指针这一块内容再补一补!

1 定义

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

注:

数据类型是指的函数返回值的类型;

(*指针变量名)两侧的括号不能省略,表示p先与*结合,是指针变量,然后再与后面的(参数表)结合;

(参数表)可以是一个参数,也可以是多个参数,不过在引用的时候要保证形参与实参一致。

2
int (*p)(int a, int b);

表示定义一个指向函数的指针变量p,它不是固定的指向哪一个函数,而是表示定义了这样一个类型的变量,它是专门用于存放函数的入口地址的。我们都知道每一个函数都占用一段内存单元,它们有一个起始地址,我们就是使用函数指针来指向函数的入口地址的。在一个程序中,同一个函数指针变量可以指向多个函数,但是要务必保证这些函数都是同类型的不同函数。

3  赋值

在给函数指针变量赋值时,只需要给出函数名,而不必给出参数,比如:

p=max;

而不能写成:

p=max(x,y);

因为是将函数入口地址赋给p,而不涉及到实参和形参的结合问题。

4 注意

和数组名代表地址数组地址首地址类似,函数名代表该函数的入口地址。p是指向函数的指针变量,它只能指向函数的入口处,而不能指向函数的中间的某条指令,因此不能用*(p+1)来表示函数的下一条指令。同理,p++,p--或者p+n都是不对的。

5 实例

#include <stdio.h>
int max(int x, int y);  /*函数声明   求最大值*/</span>
int min(int x, int y);  /*函数声明   求最小值*/</span>
int add(int x, int y);  /*函数声明     求和值*/</span>
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))
<pre name="code" class="cpp">                           /*函数定义   调用指针*/

{

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

}



当输入为:

1    2

输出结果为:

max is:2

min is:1

add is:3

6 补充

下面对上述例子再做一下补充,从本例中可以看出不论调用max,min,还是add,函数process一点都没有改动,只是在调用process函数时改变了实参函数名而已。这就增加了函数使用的灵活性。可以编写一个通用的函数来实现各种专用的功能。需要注意的是,对作为实参的函数,应在主调函数前(中)先函数声明。

参考内容:

《c程序设计》(第三版)谭浩强

时间: 2024-10-12 17:01:34

c :函数指针详解的相关文章

C++函数指针详解

学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了.本博文详细介绍一下常见的各种坑爹的函数指针. 至于指针的详细学习,推荐这篇博文C++指针详解 与数据一样,函数也有地址,函数的地址就是内存中存放函数语言代码的起始地址.函数指针就是指向这个地址.函数指针所指向的类型,就是函数本身.我们知道,指针所指向类型代表了指针所指向的内存区域的大小.所以函数指针所指向的类型,就是函数在内存中所占据内存的大小.知道了函数的起始地址和大小,所以函数指针可以很轻易的代替函数

1 函数指针详解

今天第一次发一下关于C++的文章,主要是最近做的项目要用到boost::asio作为网络库,而boost::asio要用到很多的boost::bind函数,而boost::bind又要用到自由函数指针和成员函数指针,所以这一串下来,我首先就是要讲讲函数指针这个东东. 一,自由函数指针 这个自由函数应该就是对应成员函数的那种不在类中的函数吧,英语叫做free function,我是硬翻的,欢迎同学们指正打脸.它的指针很容易写,分为两种方法吧: (一)先声明函数指针类型,再定义函数指针实例. 比如,

函数指针及其定义和用法,C语言函数指针详解

函数指针大家了解一下就行了,用得不多,但一定要认识它. 什么是函数指针 如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址.而且函数名表示的就是这个地址.既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针. 那么这个指针变量怎么定义呢?虽然同样是指向一个地址,但指向函数的指针变量同我们之前讲的指向变量的指针变量的定义方式是不同的.例如: int(*p)(int, int); 这个语句就定义了

指针数组,数组指针,指针函数,函数指针,二级指针详解

先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[]是一个数组,暂时把p[]看成是q,也就是char *(q),定义了一个指针q,只不过q是一个数组罢了,故定义了一个数组,数组里面的数据是char *的,所以数组里面的数据为指针类型.所以char *p[4]是四个指针,这四个指针组成了一个数组,称为指针数组,既有多个指针组成的数组. char(*p

C++Study 指针详解

C++指针详解 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让我们分别说明. 先声明几个指针放着做例子: 例一: int *ptr; char *ptr; int **ptr; int (*ptr)[3]; int *(*ptr)[4]; 指针的类型 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类

[转]C++ 智能指针详解

C++ 智能指针详解   一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_ptr.boost::scoped_array.boost::shared

C++ 智能指针详解

一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_ptr.boost::scoped_array.boost::shared_array.boost:

【C++】智能指针详解(一):智能指针的引入

智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引起内存泄漏. 例如:我们用指针变量来创建对象时,需要手动来删除它 string * pstr = new string("hello world!"); .... delete pstr; 事实上,即使我们非常谨慎,但有时候的一些情况仍然会让我们防不胜防: //情况一:在程序某个分支内,忘

彻底搞定C语言指针详解

1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图: 内存地址→ 6 7 8 9 10 11 12 13 ----------------------------------------------------------------- ... | | | | | | | |.. ------------------------------- ---------------------------