首页技术指针函数定义,函数指针声明

指针函数定义,函数指针声明

编程之家2026-06-181185次浏览

很多朋友对于指针函数定义和函数指针声明不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

指针函数定义,函数指针声明

函数指针如何定义

关于函数指针数组的定义方法,有两种:一种是标准的方法;一种是蒙骗法。

第一种,标准方法:

分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。

根据分析:首先说明是一个数组:数组名[]

其次,要说明其元素的数据类型指针:*数组名[].

再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型(*数组名[])().请注意,这里为什么要把“*数组名[]”用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么*数组名[]()说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组的每一个元素是指针。

指针函数定义,函数指针声明

第二种,蒙骗法:

尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数方法是:用不带有括号和参数的函数名得到。

函数名相当于一个指向其函数入口指针常量。那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。

那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。

(一)用函数指针变量调用函数

可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例:

指针函数定义,函数指针声明

1#include<stdio.h>

2#include<stdlib.h>

3

4 int main()

5{

6 int max(int,int);

7 int(*p)(int,int);

8 int a,b,c;

9 p= max;

10 scanf("%d,%d",&a,&b);

11 c=(*p)(a,b);

12 printf("a=%d,b=%d,max=%d

",a,b,c);

13 return 0;

14}

15

16 int max(int x,int y)

17{

18 int z;

19 if(x>y) z= x;

20 else z= y;

21 return(z);

22}

函数指针定义

函数指针:

函数指针是指向函数的指针变量。因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。

函数指针的声明方法为:

返回值类型(*指针变量名)([形参列表]);

注1:“返回值类型”说明函数的返回类型,“(指针变量名)”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

int func(int x);/*声明一个函数*/

int(*f)(int x);/*声明一个函数指针*/

f=func;/*将func函数的首地址赋给指针f*/

或者使用下面的方法将函数地址赋给函数指针:

f=&func;

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

注2:函数括号中的形参可有可无,视情况而定。

下面的程序说明了函数指针调用函数的方法:

例一、

#include<stdio.h>

int max(int x,int y){return(x>y? x:y);}

int main()

{

int(*ptr)(int, int);

int a, b, c;

ptr= max;

scanf("%d%d",&a,&b);

c=(*ptr)(a,b);

printf("a=%d, b=%d, max=%d", a, b, c);

return 0;

}

ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。

不过,在某些编译器中这是不能通过的。这个例子的补充如下。

应该是这样的:

1.定义函数指针类型:

typedef int(*fun_ptr)(int,int);

2.声明变量,赋值:

fun_ptr max_func=max;

也就是说,赋给函数指针的函数应该和函数指针所指的函数原型是一致的。

例二、

#include<stdio.h>

void FileFunc()

{

printf("FileFunc\n");

}

void EditFunc()

{

printf("EditFunc\n");

}

void main()

{

typedef void(*funcp)();

funcp pfun=FileFunc;

pfun();

pfun=EditFunc;

pfun();

}

如何定义指向函数的指针

这个用typedef可以完成:

先定义一个函数指针的类型:typedef

void

(*pfun)();

然后用这个类型pfun定义一个数组

pfun

ptr[5];//[]里的数字是数组元素的个数,依情况而定:这儿用5做例子

这样ptr就是一个指向函数指针的数组。

对于“把一个指针强制定义”这我还没听过这个说法,只听过把指针强制转换成某个类型的指针:

强制类型转换用()运算,仍然用上面的定义类型。

例如:

void

*p;//p是一个void指针

pfun

ptr;//ptr是一个指向void函数的指针

ptr=(pfun)p;//把p强制转换成指向void函数的指针,然后就可以把它赋值给ptr指针。

不用typedef也可以,只要合并就可以了:

void

(*ptr[5])();//这样ptr就是一个函数指针数组了.这样看很费解的!不如用typedef。

对于强制类型转换最好还是用typedef,那样可读性好。

而且个人认为指针没有那种基本类型(指向函数的指针类型),那是一种新的类型。所以要先定义那种类型才行。

用typedef定义新类型又没有什么副作用,而且容易读懂,何必非要不用typedef呢?!没必要把简单的问题复杂化!!

程序代码的可读性是很重要的,写复杂的类型而不用typedef是很令人反感的!

关于指针函数定义,函数指针声明的介绍到此结束,希望对大家有所帮助。

如何学ai人工智能?怎么样学习AI人工智能技术雨女哪里多?雨女怎么过