指针函数的定义及用法(指针函数的定义及用法)

http://www.itjxue.com  2023-01-26 00:03  来源:未知  点击次数: 

如何定义指向函数的指针?

一、定义一个函数指针的方法如下:

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

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

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

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

二、函数指针的用法:

函数指针的应用:(*指针变量名)(参数列表)

如:int c=(*ptr)(a,b);/* 函数指针 的使用*/

在C语言中,函数本身不是变量,但是可以定义指向函数的指针,也称作函数指针,函数指针指向函数的入口地址。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等。

扩展资料:

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

1、这两个概念都是简称,指针函数是指返回值是指针的函数,即本质是一个函数。我们知道函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。

2、返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。

参考资料来源:百度百科-指针

参考资料来源:百度百科-函数指针

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

1、指针函数:指的就是返回值是指针的函数,本质就是个函数。

2、函数指针:指的是指向函数的指针变量,本质就是个指针。

用法

1、指针函数:int*?func(int?a,int?b);

普通函数就是int?func(int?a,int?b);,返回值是int,而指针函数就是返回值是指针的函数,即返回值是int*。

2、函数指针:int?(*func)(int?x,int?y);

这里定义了一个函数指针,只不过这个指针的格式有点特殊,正常定义的指针是把指针变量放到最后的,即int*?p?;,p是指针变量,但是函数指针是把指针变量放到了中间,即func是指针变量,而且这是一个指向函数的指针变量,而具体指向哪个函数是自己定的。

函数指针如何定义?

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

第一种,标准方法:

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

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

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

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

第二种,蒙骗法:

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

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

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

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

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

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\n",a,b,c);

13 ? ? return 0;

14 }

15

16 int max(int x,int y)

17 {

18 ? ? int z;

19 ? ? if(xy) z = x;

20 ? ? else z = y;

21 ? ? return(z);

22 }

请问函数指针和指针函数的运用?

以前学C语言的时候也看过。不过由于用的不多,所以概念也比较模糊,直到这一阵一下子碰到了好几次有关于函数指针的程序。所以花了一些时间仔细研究了一下。1,定义函数指针:

return_type (*func_pointer)(parameter_list)

例如:int (*p)();

定义一个函数指针p,参数列表为空。

void add()

{

...

}

void main()

{

void (*p)()=add;

(*p)(); //执行函数,等效于add();

}

2,定义返回函数指针的函数:

return_type(*function(func_parameter_list))(parameter_list)

定义了一个函数function,该函数的参数列表是(function_patameter_list),返回类型是一个函数指针,这个函数指针的原型是return_type(*)(parameter_list)。例:

int (*add1(int a,int b))(int,int)

此处:此函数的函数主体为add1,add2函数作为add1的形参,返回值为一个函数指针。

注:返回的函数的形式必须为int funcname(int,int)可以用typedef来简化定义:

//此函数等效于上面函数

typedef int (*funcp)(int)(int); //定义整型函数指针

funcp add1(int a,int b);

碰到的一些实例:1、上电后把存放在Nand flash中的程序复制到内存中以0x30900000开始的地方,之后跳转到相应地址执行程序。

这是阿南的2410开发板的简易bootloader程序。由于Nand flash不能直接运行程序,所以要把程序复制到内存中运行。如下:

#define DOWNLOAD_ADDRESS 0x30900000

void main()

{

//把程序复制到内存中

...

//跳转到想应地址运行程序

*((void(*)())(DOWNLOAD_ADDRESS))();

} 分解:DOWNLOAD_ADDRESS为复制的目标地址。

void(*)() 为函数指针,参数为空。

(void(*)())DOWNLOAD_ADDRESS 把DOWNLOAD_ADDRESS转为函数指针。

*((void(*)())(DOWNLOAD_ADDRESS))(); 执行相应函数 2、实现类似于windows中的回调函数,实现两个数的加法。

int add1(int x,int y)

{

return x+y;

}

int add(int a,int b, int (* func)(int x,int y))

{

return (* func)(a,b);

}调用:

add(3,4,add1); 3、一个综合的例子:#include stdio.h

typedef int (*funcp)(int,int);//普通三个变量的加法函数

int func(int x,int y,int z)

{

// return x+y;

printf("func:x+y+z=%d\n",x+y+z);

return x+y+z;

}/*实现两个数的减法,并返回函数func的地址。此函数的主体为dec(int x,int y),返回值为一个函数指针。注意返回值为函数指针的函数的定义。一开头已经给出。return_type(*function(func_parameter_list))(parameter_list)*/

void (*dec(int x,int y))(int a,int b,int c)

{

printf("dec:x-y=%d\n",x-y);

return (void *)func;

}int add(int x,int y)

{

return x+y;

}/*此函数通过回调实现a+b+a+b,并且返回函数add的地址。此函数的主体为add1,add2函数作为add1的形参。返回类型为函数指针。*/

int (*add1(int a,int b,int (*add2)(int x,int y)))(int,int)

{

printf("add1:a+b+a+b=%d\n",a+b+(*add2)(a,b));

return add2;

}/*此函数等效于add2,只不过用typedef进行分开来定义,看的更加清晰。typedef int (*funcp)(int,int); 定义一个函数指针为funcp. funcp add4等同于(*add4)(int,int), funcp add3(int a,int b, (*add4)(int,int)) 等同于 int (*add3(int a,int b,int (*add4)(int x,int y)))(int,int)*/

funcp add3(int a,int b, funcp add4)

{

printf("add3:a+b+a+b=%d\n",a+b+add4(a,b));

return add4;

}

//函数a1-a5用来验证函数指针数组的功能。

void a1()

{

printf("this is a1!\n");

}

void a2()

{

printf("this is a2!\n");

}

void a3()

{

printf("this is a3!\n");

}

void a4()

{

printf("this is a4!\n");

}

void a5()

{

printf("this is a5!\n");

}int main()

{

int addr;

//定义函数指针

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

char i;

//定义函数指针数据,初始化存放a1-a5的函数地址。

void (*funcarry[5])()={a1,a2,a3,a4,a5};

int a[5]={(int)a1,(int)a2,(int)a3,(int)a4,(int)a5};//直接把函数地址转化为整型

addr=(int)func;//把函数地址赋给一个函数指针p

p=func;//把印出func的地址。

printf("func address is %d\n",addr);//利用一个整型的地址来实现3+4+5

printf("This is addr %d\n",(*((int(*)(int,int,int))addr))(3,4,5));//利用函数指针来实现3+4+5

printf("This is func pointer %d\n",(*p)(3,4,5));//利用dec函数实现5-4,并且打印出返回的函数指针的地址。

printf("func address is %d %d\n",dec(5,4),addr);//以下两个功能一致,实现3+4+3+4

printf("add for add1 address is %d %d\n",add1(3,4,add),(int *)add);

printf("add for add3 address is %d %d\n",add3(3,4,add),(int *)add);//利用函数指针数组实现函数a1-a5的执行。以下两种方法等效。

for(i=0;i5;i++)

(*funcarry[i])();

for(i=0;i5;i++)

(*((void(*)())a[i]))();

} 运行环境:Red hat 9.0运行结果:func address is 134513448

func:x+y+z=12

This is addr 12

func:x+y+z=12

This is func pointer 12

dec:x-y=1

func address is 134513448 134513448

add1:a+b+a+b=14

add for add1 address is 134513529 134513529

add3:a+b+a+b=14

add for add3 address is 134513529 134513529

this is a1!

this is a2!

this is a3!

this is a4!

this is a5!

this is a1!

this is a2!

this is a3!

this is a4!

this is a5!

(责任编辑:IT教学网)

更多

推荐微软认证文章