C语言函数指针定义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言函数指针定义相关的知识,希望对你有一定的参考价值。

pFn t1();
pFn t2();

int main()

pFn fn = t1 ;

while(1)
fn = fn();



pFn t1()

printf("t1\n");
return t2 ;


pFn t2()

printf("t2\n");
return t1 ;


请问,想通过编译,pFn函数指针类型怎么定义?
不是我故意绕,我确实是遇到了。大家的见意都很好!我也试过很多办法。
一楼的方法比较正确,但fn=fn();改为fn=(pFn)fn();程序才能通过编译并正常运行。上面的t1与t2两个函数只是举的两个简单例子。在我的应用中,可能出现大概30个这样的函数。函数之间存在一种链型关系。
虽然typedef void* (*pFn)()能解决问题。我还是渴望找到一个更完美的定义方法。
谢谢大家的回复。

有比:typedef void* (*pFn)();更好的答案吗? 如果有请阐明你的理由。

在最上面加一句这样的定义
typedef void*(*pFn)();
pFn可以这样理解:首先pFn是一个指针,指针指向一个函数(或者说pFn是一个函数指针),此函数返回一个无类型的指针。最终定义的变量及函数都是指针罢了,不过是指针的类型不同。所以在编译时会有警告,说指针类型不匹配。但对于程序来讲,都是可以在特定的上下文中使用的。
运行结果是
t1,t2交替出现。

其实void也可以换为其它的类型如int, double等

又想到一个很好的办法:
这次编译不会有警告,运行也不会出错。
示例代码如下所示
#include <stdio.h>

long t1();
long t2();

int main()

long(*fn)()= (long (*)()) t1 ;

while(1)
fn = (long (*)()) fn();



long t1()

printf("t1\n");
return (long)t2 ;


long t2()

printf("t2\n");
return (long)t1 ;
参考技术A 函数指针就是函数的指针。它是一个指针,指向一个函数。看例子: A) char * (*fun1)(char * p1,char * p2); B) char * *fun2(char * p1,char * p2); C) char * fun3(char * p1,char * p2); 看看上面三个表达式分别是什么意思? C):这很容易,fun3 是函数名,p1,p2 是参数,其类型为char *型,函数的返回值为char *类型。 B):也很简单,与C)表达式相比,唯一不同的就是函数的返回值类型为char**,是个二级指针。 A):fun1 是函数名吗?回忆一下前面讲解数组指针时的情形。我们说数组指针这么定义或许更清晰: int (*)[10] p; 再看看A)表达式与这里何其相似!明白了吧。这里fun1 不是什么函数名,而是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。同样,我们把这个表达式改写一下:char * (*)(char * p1,char * p2) fun1; 参考技术B pFn fn = t1 ;
pFn t1();
这个怎么定义啊
t1返回 函数指针, 又是函数指针的初始值,搞笑把楼主
这不是死循环了!
typedef int(*pFn)(int p);
pFn fn = t1;->说明t1为:int t1(int p);
pFn t1();//error
楼主你太有才了
参考技术C 好像不行啊,加了typedef void* (*pFn)(void);这一句会出现这样的错误
“return”: 无法从“pFn (__cdecl *)(void)”转换为“pFn”,
实在想不通,反回函数名应该使用什么类型。
参考技术D 【函数指针】
在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。
1.函数指针定义
函数类型 (*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int (*f)(int x);
double (*ptr)(double x);
在定义函数指针时请注意:
函数指针和它指向的函数的参数个数和类型都应该是—致的;
函数指针的类型和函数的返回值类型也必须是一致的。
2.函数指针的赋值
函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。
例如,
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
3.通过函数指针调用函数
函数指针是通过函数名及有关参数进行调用的。
与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。
由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:
首先,要说明函数指针变量。
例如:int (*f)(int x);
其次,要对函数指针变量赋值。
例如: f=func; (func(x)必须先要有定义)
最后,要用 (*指针变量)(参数表);调用函数。
例如: (*f)(x);(x必须先赋值)
【例】任意输入n个数,找出其中最大数,并且输出最大数值。
main()

int f();
int i,a,b;
int (*p)(); /* 定义函数指针 */
scanf("%d",&a);
p=f; /* 给函数指针p赋值,使它指向函数f */
for(i=1;i<9;i++)

scanf("%d",&b);
a=(*p)(a,b); /* 通过指针p调用函数f */

printf("The Max Number is:%d",a)

f(int x,int y)

int z;
z=(x>y)?x:y;
return(z);

运行结果为:
343 -45 4389 4235 1 -534 988 555 789↙
The Max Number is:4389
函数指针
函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。
函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数。
函数指针的声明方法:
数据类型标志符 (指针变量名) (形参列表);
一般函数的声明为:
int func ( int x );
而一个函数指针的声明方法为:
int (*func) (int x);
前面的那个(*func)中括号是必要的,这会告诉编译器我们声明的是函数指针而不是声明一个具有返回型为指针的函数,后面的形参要视这个函数指针所指向的函数形参而定。
然而这样声明我们有时觉得非常繁琐,于是typedef可以派上用场了,我们也可以这样声明:
typedef int (*PF) (int x);
PF pf;
这样pf便是一个函数指针,方便了许多。当要使用函数指针来调用函数时,func(x)或者 (*fucn)(x) 就可以了,当然,函数指针也可以指向被重载的函数,编译器会为我们区分这些重载的函数从而使函数指针指向正确的函数。
例子:

typedef void (*PFT) ( char ,int );
void bar(char ch, int i)

cout<<"bar "<<ch<<' '<<i<<endl;
return ;

PFT pft;
pft = bar;
pft('e',91);

C语言指向二维数组的指针

/* 将3位学生4门课成绩读入并存储在二维数组score中,然后输出第n(约定n<=2)个学生的成绩,要求用户编程部分对数组score及其元素的访问必须使用指针实现,即自定义函数头和函数体中不得出现数组下标形式的表示法。编程可用素材:printf("\nthe score of No %d are:"…、printf("%6.1f"…。 */

#include<stdio.h>

/* userCode(<80字符): 自定义函数之原型声明 */
______________________________

int main(void)

int n, i;
float score[3][4];

printf("input student's score:\n");
for (i=0; i<=2; i++)

printf(" student %d: ", i);
scanf("%f %f %f %f", &score[i][0], &score[i][1], &score[i][2], &score[i][3]);


printf("\ninput student No: ");
scanf("%d", &n);
search(score, n);

return 0;


/* User Code Begin:考生在此后完成自定义函数的设计,行数不限 */

一、你的 float score 数组定义的是:一个3行、4列的二维浮点数组,数组的元素为浮点数。如果你换个格式书写就清晰了!
float score[3][4]=65,67,70,60,,80,87,90,81,,90,99,100,98;
在调用的过程中,score 就是这个数组的首地址,指向的是浮点数组65,67,70,60,。score + 1 指向的是数组80,87,90,81,。
二、你的 float *p 定义的是:一个指向浮点数的指针。这个是一维的。
在调用的过程中,float 指向的是 xx。一个浮点数字。
两个的定义不同,所以参数传递过程中会出错。
三、你的 float (*p)[4] 定义的是:一个指向含有四个元素的浮点数组的指针。
在调用的过程中,float 指向的是xxx,xx,xx,xx,,由四个浮点数组成的数组。
这时两个定义相同,所以参数传递过程中没有错误。
四、有个建议,你的程序书写格式不清晰,不利于你纠错和修改,应该尽量的清晰、明确,不建议使用简化方式定义参数。
作为一个软件工作者,应该尽量使程序流畅、格式清晰、易读,这是一个软件工作者最基本的职业素养。
格式化后,程序如下,会清晰很多:
#include<stdio.h>
void main()

void search (float (*p)[4],int n);/*这里的 float *p 好像有问题*/
float score[3][4]=65,67,70,60,,80,87,90,81,,90,99,100,98;
search(score,2);

void search(float (*p)[4],int n)/*这里的 float *p 好像有问题*/

int i;
printf("the score of No.%d are:\\n",n);
for(i=0;i<4;i++)

printf("%5.2f",*(*(p+n)+i));

printf("\\n");
参考技术A 头总是有点儿

以上是关于C语言函数指针定义的主要内容,如果未能解决你的问题,请参考以下文章

C语言指针函数?

c语言 结构体的指针作为函数参数问题

C语言中函数指针*p **p 和数组不是很明白,可以解释下麽?

C语言如何声明一个返回函数指针的函数?

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

C语言中的函数指针