`
gaofen100
  • 浏览: 1200084 次
文章分类
社区版块
存档分类
最新评论

函数指针

 
阅读更多

函数指针

函数指针可能是最容易引起理解上的困惑的声明。函数指针在DOS时代写TSR程序时用得最多;
在Win32和X-Windows时代,他们被用在需要回调 函数的场合。
当然,还有其它很多地方需要用到函数指针:虚函数表,STL中的一些模板,
Win NT/2K/XP系统服务等。让我们来看一个函数指针的简单例子:

int (*p)(char);

这里p被声明为一个函数指针,这个函数带一个char类型的参数,并且有一个int类型的返回值。
另外,带有两个float类型参数、返回值是char类型的指针的指针的函数指针可以声明如下:

char ** (*p)(float, float);

那么,带两个char类型的const指针参数、无返回值的函数指针又该如何声明呢?参考如下:

void * (*a[5])(char * const, char * const);

“右左法则”[重要!!!]

The right-left rule: Start reading the declaration from the innermost parentheses,
go right, and then go left. When you encounter parentheses,
the direction should be reversed.
Once everything in the parentheses has been parsed, jump out of it.
Continue till the whole declaration has been parsed.

这是一个简单的法则,但能让你准确理解所有的声明。
这个法则运用如下:从最内部的括号开始阅读声明,向右看,然后向左看。
当你碰到一个括号时就调转阅读的方向。括号内的所有内容都分析完毕就跳出括号的范围。
这样继续,直到整个声明都被分析完毕。

对上述“右左法则”做一个小小的修正:当你第一次开始阅读声明的时候,你必须从变量名开始,
而不是从最内部的括号。

下面结合例子来演示一下“右左法则”的使用。

int * (* (*fp1) (int) ) [10];

阅读步骤:
1. 从变量名开始 -------------------------------------------- fp1
2. 往右看,什么也没有,碰到了),因此往左看,碰到一个* ------ 一个指针
3. 跳出括号,碰到了(int) ----------------------------------- 一个带一个int参数的函数
4. 向左看,发现一个* --------------------------------------- (函数)返回一个指针
5. 跳出括号,向右看,碰到[10] ------------------------------ 一个10元素的数组
6. 向左看,发现一个* --------------------------------------- 指针
7. 向左看,发现int ----------------------------------------- int类型


总结:fp1被声明成为一个函数的指针,该函数返回指向指针数组的指针.


再来看一个例子:

int *( *( *arr[5])())();

阅读步骤:
1. 从变量名开始 -------------------------------------------- arr
2. 往右看,发现是一个数组 ---------------------------------- 一个5元素的数组
3. 向左看,发现一个* --------------------------------------- 指针
4. 跳出括号,向右看,发现() -------------------------------- 不带参数的函数
5. 向左看,碰到* ------------------------------------------- (函数)返回一个指针
6. 跳出括号,向右发现() ------------------------------------ 不带参数的函数
7. 向左,发现* --------------------------------------------- (函数)返回一个指针
8. 继续向左,发现int --------------------------------------- int类型

总结:arr被声明成为一个函数的数组指针,该函数返回指向函数指针的指针。??


还有更多的例子:

float ( * ( *b()) [] )();
// b is a function that returns a
// pointer to an array of pointers
// to functions returning floats.

void * ( *c) ( char, int (*)());
// c is a pointer to a function that takes
// two parameters:
// a char and a pointer to a
// function that takes no
// parameters and returns
// an int
// and returns a pointer to void.

void ** (*d) (int &, char **(*)(char *, char **));
// d is a pointer to a function that takes
// two parameters:
// a reference to an int and a pointer
// to a function that takes two parameters:
// a pointer to a char and a pointer
// to a pointer to a char
// and returns a pointer to a pointer
// to a char
// and returns a pointer to a pointer to void

float ( * ( * e[10]) (int &) ) [5];
// e is an array of 10 pointers to
// functions that take a single
// reference to an int as an argument
// and return pointers to
// an array of 5 floats.

分享到:
评论

相关推荐

    Keil C51中函数指针的使用

    Keil C51中函数指针的使用 函数指针是C语言中的一种重要概念,在Keil C51中函数指针的使用具有非常重要的意义。函数指针可以使得程序更加灵活和灵活,特别是在单片机系统中,嵌入式操作系统、文件系统和网络协议栈...

    C语言指针函数和函数指针详细介绍.

    C语言指针函数和函数指针详细介绍 C语言中指针函数和函数指针是两个不同的概念,但它们之间存在着紧密的联系。本文将对C语言中的指针函数和函数指针进行详细的介绍。 一、指针函数 指针函数是指返回值为指针的...

    C51 函数指针与再入函数

    C51 函数指针与再入函数 函数指针是 C 语言中几个难点之一。由于 8051 的 C 编译器的独特要求,函数指针和再入函数有更多的挑战需要克服。主要由于函数变量的传递。典型的(绝大部分 8051 芯片)函数变量通过堆栈的...

    函数指针和指针函数的理解

    我知道函数指针是指向函数的指针,指针函数还是指一个函数的返回值是一个指针,但下面 的几道题还是感觉很迷惑。各位能否讲的详细点呢? (1)float(**def)[10] def是什么? (2)double*(*gh)[10] gh是什么? (3)double...

    函数指针和函数对象

    函数指针和函数对象 函数指针(全局函数/类成员函数)和函数对象是C++语言中两个重要的概念,经常被混淆和误解。本文将详细介绍函数指针和函数对象的定义、类型、使用方法和区别。 一、函数指针 函数指针是指向...

    彻底理解指针,指针数组和数组指针,指针函数和函数指针

    彻底理解指针,指针数组和数组指针,指针函数和函数指针.doc

    指针函数和函数指针变量

    指针函数和函数指针变量指针 函数和函数指针变量

    函数指针的范例

    函数指针的范例 函数指针是 C 语言中的一种高级特性,它允许开发者将函数作为参数传递、返回值或存储在数据结构中。本文将通过一个简单的示例程序,深入探讨函数指针的概念和应用。 首先,让我们从一个简单的函数...

    C/C++ 函数指针的意义,函数指针的用法

    C/C++ 函数指针的意义,函数指针的用法

    C语言函数指针.doc

    一、函数指针的定义 顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。看例子: A) char * (*fun1)(char * p1,char * p2); B) char * *fun2(char * p1,char * p2); C) char * fun3(char * p1,char * ...

    一般函数指针和类的成员函数指针

    C++中一般函数指针和类的成员函数指针的区别

    回调函数就是一个通过函数指针调用的函数

    回调函数是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的...

    函数指针和指针函数的区别

    本文叙述了函数指针和指针函数的区别,防止程序员混淆两者。

    易语言简单类函数指针

    易语言简单类函数指针源码,简单类函数指针,创建线程,取类函数指针,类函数,娃哈哈,CreateThread,SetWindowTextA

    函数指针和指针函数,const的用法,指针常量,常量指针的用法

    函数指针和指针函数的区别,以及const的用法,指针常量,常量指针的用法

    理解复杂的CC++声明 const, typedef , 函数指针

    理解复杂的C/C++声明 const, typedef, 函数指针 在C/C++编程中,声明是一种定义变量、函数、数组、指针等的方式。 declares 是一种基本的语法结构,用于定义变量、函数、数组、指针等。在本文中,我们将详细介绍...

    函数指针就是指向函数的指针;类成员方法指针,类具有类域操作符

    在C++中,函数指针一般是指全局命名空间中的函数指针,类成员函数指针,与函数指针不同的是,类具有类域操作符,在声明类成员函数指针的时候,要指定成员函数返回值类型、类域操作符、成员函数参数列表

    Delphi函数指针

    Delphi 函数指针 Delphi 函数指针是一种强大的编程技术,它允许开发者将函数作为参数传递给其他函数,或者将函数指针作为变量来存储和使用。下面将详细介绍 Delphi 函数指针的使用和应用。 函数指针的声明 在 ...

    c++函数指针使用demo

    c++的指针特性学习之函数指针,代码中给出了函数指针的声明方式和使用方式,供大家使用函数指针参考

    详解函数指针和指针函数

    详解函数指针和指针函数 函数类型 (*指针变量名)(形参列表); “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的...

Global site tag (gtag.js) - Google Analytics