c-指向函数的指针不需要定义?

问题描述

指向函数的指针不需要定义?

我看《C程序设计语言》书,看到103页时,有一个关于指向函数的指针把我看糊涂了。如图所示,函数指针就是里面那个comp。可我找了半天也找不到它在哪里定义的,那么当调用它时它是怎么转换的呢?比如那个?:返回的是numcmp,那么最后是怎么转到numcmp函数里面呢?

解决方案

题主弄混了一个关键的概念:指向函数指针的本质是什么,在这里也就是您所说的comp。
请注意,这里的comp其实是一个变量,一个指针变量。而不是楼主所认为的函数!它不需要包含任何代码,因为它是一个指针变量。当这个comp被赋值以后【一般都是赋一个函数代码段地址值】,那么运行时,有关comp的代码语句都会直接把comp换成这个地址值,比如您截图中的numcmp,当把它赋值给comp以后,以后再遇到comp时,就会直接调用numcmp,而不是从comp“函数里”转到numcmp。

请题主看下面的图片代码:

相信您会看明白,这里的ptr【comp的兄弟,另一个函数指针】,其实是完全被当成一个指针变量赋值的。
当然,也可以在声明时就给ptr初始化,不过格式要写成这样:【int (*ptr)(int a, int b) = fun;】,至于ptr的后面为什么要跟一对参数列表,只是为了在编译时检查错误,看看被指向的函数是不是跟指向函数指针声明时相匹配。它虽然有参数表,但仅仅是貌似函数而已,记住,披着羊皮的狼,是狼,不是羊!

解决方案二:

numcmp的实现可能在其他地方,书上并不一定写全了
这里只是为了说明。

解决方案三:

这种函数俗语叫回调函数

时间: 2024-08-09 06:10:29

c-指向函数的指针不需要定义?的相关文章

函数指针 c语言 指针-C语言指向函数的指针的调用

问题描述 C语言指向函数的指针的调用 int *d_bubblesort(int a[]int n)//数组长度为n的冒泡降序排序{int ij;int temp;for(i=0;i {for(j=n-1;j>i;j--){if(a[j]>a[j-1]){temp=a[j-1];a[j-1]=a[j];a[j]=temp;} }}return(a);} void main(){int i;int *p;int a[10]={65412398710};int (*fun)(intint);fun

《C和C++代码精粹》——2.12 指向函数的指针

2.12 指向函数的指针 C和C++代码精粹 一个指针可以指向函数也可以指向存储的对象.下面的语句声明fp是一个指向返回值为整型(int)的函数的指针: int(*fp)( ); *ftp的圆括号是必需的,没有它的语句 int *fp( ); 将fp声明为一个返回指向整型(int)指针的函数.这就是将星号与类型声明紧密相连的方式成为逐渐受人们欢迎的方式的原因之一. int fp(); //方式说明fp()返回一个指向整型的指针(int ) 当然,这种方式建议你通常应该每条语句只声明一个实体,否则

C++中返回指向函数的指针示例_C 语言

在C++中,函数的形参可以是指向函数的指针,函数也可以返回函数的指针.例如:int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参.使用typedef可使得定义更加易懂:typedef int (*PF) (int *,int);PF ff(int);下面给出一个例子: 复制代码 代码如下: #inclu

C++指向函数的指针实例解析_C 语言

通常来说C++函数指针是指指向函数的指针,而非指向对象的指针.就像其他指针一样,函数指针也指向某个特定的类型.函数类型由其返回类型以及形参表确定,而与函数名无关. 定义: char (*fP)(char,int); 赋值: char function(char i,int j) { } fp=function; 调用 (*fp)(10,100); type char (*FUN)(char,int);//类型定义 FUN fp ;//定义fp为指向函数的指针 volatile的用法和作用: co

2013-7-10学习笔记[字符串操作,指向函数的指针]

字符串处理函数1.strlen函数 这个函数可以用来测量字符串的字符个数,不包括\0 int size = strlen("mj"); // 长度为2     char s1[] = "lmj";  int size1 = strlen(s1); // 长度为3     char s2[] = {'m', 'j', '\0', 'l', 'm', 'j', '\0'};  int size2 = strlen(s2); // 长度为2    //在统计字符长度的时候

C语言 函数指针(指向函数的指针)详解_C 语言

一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数.这种指针就是函数指针. 函数指针的定义形式为: returnType (*pointerName)(param list); returnType 为函数返回值类型,pointerNmae 为指针名称,param list 为函数参数列表.参数列表中

C++指向函数的指针用法详解_C 语言

本文以实例形式展示了C++指向函数的指针用法,是深入学习C++所必须掌握的关键知识点.分享给大家供大家参考之用.具体方法如下: 函数指针 现来看看以下声明语句,看看其含义: float (*h(int, void (*)(int)))(int); 以下是一个变量指针的定义语句: float* pf; 以下是一个普通函数的声明语句: float f(); 请看以下声明语句: float* g(); 因为()的优先级高于*, 所以相当于: float* (g()); g是一个函数, 返回值为floa

用指向函数的指针作函数参数

/**有2个整数a,b,有用户输入1,2,或3,如输入1, 程序就给出a和b中大者,输入2,就给出a和b中小者, 输入3,就给出a和b的和**/ #include <stdio.h> #include <stdlib.h> int main() { int f(int x,int y,int (*p)(int ,int )); int max(int x,int y); int min(int x,int y); int sum(int x,int y); int a=34,b=-

如何使用指向类的成员函数的指针(详解!)

我们首先复习一下"指向函数的指针"如何使用?   [cpp] view plain copy    print? void print()   {   }   void (*pfun)(); //声明一个指向函数的指针,函数的参数是 void,函数的返回值是 void   pfun = print;   //赋值一个指向函数的指针   (*pfun)();    //使用一个指向函数的指针     比较简单,不是吗?为什么*pfun需要用()扩起来呢? 因为*的运算符优先级比()低,如