知识大全 C/C++语言中指向函数的指针

Posted 函数

篇首语:学向勤中得,萤窗万卷书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C/C++语言中指向函数的指针相关的知识,希望对你有一定的参考价值。

C/C++语言中指向函数的指针  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

在C语言中 函数本身不是变量 但可以定义指向函数的指针 这种指针可以被赋值 存放于数组之中 传递给函数及作为函数的返回值等  --《The C Programming Language Second Edition》 下面给出几个简单的例子来说明指向函数的指针 第一个例子说明指向函数的指针如何说明 赋值 调用 #include #define TESTDATE int func(int a)  /* func用于打印一个整数 */ return printf( %d\\n a); main() int (*FunctionPionter)(int a); FunctionPionter = func; (*FunctionPionter)(TESTDATE); return ; 其中重点语句的含义如下 int (*FunctionPionter)(int a); FunctionPionter: 指向一个返回整数的函数的指针 这个指针有一个整数参数 FunctionPionter = func; 将FunctionPionter指向函数func 其中函数必须已经定义 且函数和函数指针的说明的返回值必须一致   (*FunctionPionter)(TESTDATE); 通过函数指针调用函数 因为函数指针已经指向函数 所以用*取出函数指针的内容就为函数本身 下面这个例子显示如何将指向函数的指针传递给函数 作为函数的返回类型 在这个例子中 有三个函数 hello 返回字符指针的函数 用来返回字符串 hello world!\\n RetFunc 返回一个指向函数的指针的函数 且返回指针所指的那个函数为一个返回字符指针的函数 call 返回一个void *型的指针 且call有一个指向函数的指针的参数 且这个函数指针返回一个字符指针 #include #define MAX main() void *call(char *(*)()); char *(*RtnFunc())();   /* 上面两个说明有些复杂 */ printf( %s call(RtnFunc())); return ; char *hello() return Hello World!\\n ; char *(*RtnFunc())() return hello; void *call(char *(*func)()) return (*func)(); 上面的例子中 main()无法直接调用hello函数 利用两个函数分别返回hello和调用hello 实现了在main()中调用hello 虽然 似乎这个程序显得多余但却很好的说明了如何把指向函数的指针传递给函数 作为函数的返回 其中call函数利用了void *型指针的灵活机制 使得call的适用性大为增加 这也正是指向函数的指针的优点之一 同样的例子是《The C Programming Language Second Edition》中下面这个函数调用 qsort((void **) lineptr nlines (int (*)(void * void *))(numeric ? numcmp : strcmp)); 其中 使用了两次强制类型转换 其中第二甚至是利用指向函数的指针 将函数的类型进行了转换 当然上面语句在某些编译器上无法通过 因为某些编译器要求条件表达 表达式 ? 表达式 : 表达式 中表达式2与表达式3的类型相同 当然这样的要求是不符合ANSI标准的 在ANSI标准中 如果表达式2与表达式3的类型不同 则结果的类型由类型转换规则决定 当然 我们可以变同一下 先将两个函数的类型进行强制转换来达到目的 qsort((void **) lineptr nlines numeric ? (int (*)(void * void *))numcmp : (int (*)(void * void *))strcmp)); 对于如何直接说明一个像RtnFunc一样返回指向函数的指针的函数 我查阅了不少资料 都没有找到答案 最后是自己硬著头皮摸索出来的 由此 我也对C的复杂说明有了更深刻的体会 将在以后的技术日记中写出来 当然在我看来 过多的 不合适的使用这些复杂说明 并不是一种好的编程风格 因为它将使程序变得难以理解 同时也增加了出错的可能性 一个比较好的折衷的方法是使用typedef来使程序的含义明朗 下面给出用typedef给写上面那个程序的例子 其中定义个一个类型PtoFun 用typedef说明PtoFun是指向函数的指针类型 指针所指的函数返回一个字符指针 且没有参数 #include #define MAX typedef char *(*PtoFun)(); main() void *call(PtoFun); PtoFun RtnFunc(); printf( %s call(RtnFunc())); return ; char *hello() return Hello World!\\n ; PtoFun RtnFunc() return hello; void *call(PtoFun func) return (*func)(); 改写后的程序的可读性大为增加 给人一目了然的感觉 cha138/Article/program/net/201311/11889

相关参考

知识大全 数据结构之线性表的顺序存储[3]

  根据C语言中函数参数的传递采用值传送的规则有时定义一个指向SeqList类型的指针更为方便能够实现信息的回送因此我们定义一个指针类型  typedefSeqList*PSeqList;  PSeq

知识大全 最近面试过的一些编程和算法面试题

给一颗二叉树每个节点都有左孩子指针和右孩子指针(当然可能为空)要求给每个节点添加一个指针这个指针要指向它的同一层的紧临的兄弟(要求写代码)给一个单链表将其反转(要求写代码)写一个函数传入一个字符串判断

知识大全 数据结构考研分类复习真题 第六章 答案 (五)[41]

  [题目分析]双链就利用二叉树结点的左右指针重新定义左指针为指向前驱的指针右指针是指向后继的指针链表在遍历中建立下面采用中序遍历二叉树  BiTreehead=nullpre;//全局变量链表头指针

知识大全 分享关于Java 语言中的函数编程

分享关于Java语言中的函数编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果您从事大型企

知识大全 我是谁

我是谁?这句话都代表什么含义。谢谢太多的困惑而无法认识自己c语言这句话代表的含义c语言这种复杂声明的解释有固定的规律楼主可以搜搜相关的文章对于这个具体的例子的意思是:声明function为一个函数指针

知识大全 在C#中实现类似C++函数指针数组的功能

在C#中实现类似C++函数指针数组的功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在大家开

知识大全 有个二级单链表,其中每个元素都含有一个指向一个单链表的指针。写程序把这个二级链表展开称一级单链表

这个二级单链表只包括一些headpublicclassLinkpublicLinkNext;publicintData;publicLink(Linknextintdata)thisNext=next

知识大全 数据结构考研分类复习真题 第六章 答案 (五)[27]

  [题目分析]叶子结点只有在遍历中才能知道这里使用中序递归遍历设置前驱结点指针pre初始为空第一个叶子结点由指针head指向遍历到叶子结点时就将它前驱的rchild指针指向它最后叶子结点的rchil

知识大全 数据结构考研分类复习真题 第七章 图[58]

  .请设计一个图的抽象数据类型(只需要用类PASCAL或类C/C++语言给出其主要功能函数或过程的接口说明不需要指定存储结构也不需要写出函数或过程的实现方法)利用抽象数据类型所提供的函数或过程编写图

知识大全 线索二叉树

线索二叉树概念.定义  n个结点的二叉链表中含有n+个空指针域利用二叉链表中的空指针域存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为线索)  这种加上了线索的二叉链表称为线索链