C语言的问题:如何申明指向任意类型函数的指针

2021-02-02 06:56:40 字数 5039 阅读 6005

1楼:刚刚学字母

void指针可以指向任意类型的数据,包括函数指针,亦即可用任意数据类型的指针对void指针赋值。

例如:int * pint;

void *pvoid;

pvoid = pint; /* 不过不能 pint= pvoid; */

如果要将pvoid赋给其他类型指针,则需要强制类型转换如:pint= (int *)pvoid;

2楼:尼玛真响亮

定义成什么指针都无所谓,里面都可以强制转换。

关键是传进去的函数的参数应该不能是任意的吧。

3楼:匿名用户

函数类型应该与被传入的函数类型一致,如果想任意选的话好像c语言还不可以,我没听说过,

要么是我孤陋寡闻了

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

4楼:匿名用户

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

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

1、int func(int x); /* 声明一个函数 */2、int (*f) (int x); /* 声明一个函数指针 */3、f=func; /* 将func函数的首地址赋给指针f */二、函数指针的用法:

函数指针的应用:(*指针变量名)(参数列表)如:int c=(*ptr)(a,b);/* 函数指针 的使用*/在c语言中,函数本身不是变量,但是可以定义指向函数的指针,也称作函数指针,函数指针指向函数的入口地址。

这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等。

5楼:许诗文

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

可以用指针变量

指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。

可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例:

1 #include

2 #include

3 4 int main()

5 15

16 int max(int x,int y)

17 main函数中的" c = max(a,b); " 包括了一次函数的调用。每一个函数都占用一段内存单元。因此,可以用一个指针变量指向一个函数,通过指针变量来访问它指向的函数。

第7行:int (*p)( int,int ); 用来定义 p 是一个指向函数的指针变量,该函数有两个整形参数,函数值为整形。注意 *p 两侧的括号不可省略,表示 p 先与 * 结合,是指针变量,然后再与后面的 ( ) 结合,表示此指针变量指向函数,这个函数值 (即函数的返回值) 是整形的。

如果写成 int *p ( int,int ) ,由于( )的优先级高于 *,它就成了声明一个函数p( 这个函数的返回值是指向整形变量的指针)。

赋值语句 p = max ; 作用是将函数 max 的入口地址赋给指针变量p。和数组名代表数组首元素地址类似,函数名代表该函数的入口地址。这时 p 就是指向函数 max 的指针变量,此时 p 和 max都指向函数开头,调用 *p 就是调用 max 函数。

但是p作为指向函数的指针变量,它只能指向函数入口处而不可能指向函数中间的某一处指令处,因此不能用 *(p + 1)来表示指向下一条指令。

注意:(1) 指向函数的指针变量的一般定义形式为:

数据类型 (*指针变量名)(函数参数列表)

这里数据类型就是函数返回值的类型

(2) int (* p) ( int,int ); 它只是定义一个指向函数的指针变量 p, 它不是固定指向哪一个函数的,而只是表示定义这样一个类型的变量,它是专门用来存放函数的入口地址的。在程序中把哪一函数(该函数的值应该是整形的,且有两个整形参数)的地址赋给它,他就指向哪一个函数。在一个函数中,一个函数指针变量可以先后指向同类型的不同函数。

(3) p = max; 在给函数指针变量赋值时,只需给出函数名而不必给出函数参数,因为是将函数的入口地址赋给 p ,而不涉及 实参和形参的结合问题,不能写成 p = max(a,b);

(4) c = (*p)(a,b) 在函数调用时,只需将( *p ) 代替函数名即可,后面实参依旧。

(5) 对于指向函数的指针变量,像 p++ ,p+n.....是无意义的。

(二) 用指向函数的指针作为函数参数

函数指针变量通常的用途之一就是把指针作为参数传递到其他函数。

函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量,也可以是指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。

void sub ( int ( *x1) (int), int (*x2) (int,int) )

如果实参为两个 函数名 f1 和 f2. 在函数首部定义x1、x2为函数指针变量,x1指向的函数有一个整形形参,x2指向的函数有两个形参。i 和 j 是函数f1 和 f2所要的参数。

函数sub的形参 x1、x2(指针变量)在函数 sub 未被调用时并不占用内存单元,也不指向任何函数。在sub被调用时,把实参函数 f1 和 f2的入口地址传给形式指针变量 x1 和 x2.

既然在 sub 函数中要调用 f1 和 f2 函数,为什么不直接调用f1 和 f2而要用函数指针变量呢? 确实,如果只是用到f1 和 f2 函数,完全可以在sub函数中直接调用f1 和 f2,而不必设指针变量 x1 和 x2。 但是,如果在每次调用sub时,调用的函数不是固定的,下次是f3 和 f4,再是f5 和 f6...

这时用指针变量就比较方便了。

6楼:过客守望者

指向函数

的指针的用法:

1.指向函数的指针的类型

指向函数的指针应该怎样声明?拿两个字符串的比较函数来说:

int str***pare(const string & s1, const string & s2) ;

如果两个字符串相等就返回0,否则,s1< s2返回负数,s1 > s2返回正数其实函数名不是其类型的一部分,函数类型是只由它的返回类型和参数来决定。函数名称只不过是指向函数**的地址。所以指向函数的指针的类型应该用下面的形式声名:

int (*pf)( const string &, const string & );

2.初始化和赋值

完全匹配时初始化和赋值才是正确的如果不匹配则将产生编译错误消息在指向函数

类型的指针之间不存在隐式类型转换。

int (*pfi)( const string &, const string & ) = str***pare;

int (*pfi2)( const string &, const string & ) = &str***pare;

指向函数的指针可以如下被赋值

pfi = str***pare;

pfi2 = pfi;

3.调用

如下**:

#include

using namespace std;

int min( int*, int );

int (*pf)( int*, int ) = min;

const int iasize = 5;

int ia[ iasize ] = ;

int main()

int min( int* ia, int sz )

4.函数指针的数组

我们可以声明一个函数指针的数组例如

int (*testcases[10])();

将testcases 声明为一个拥有10 个元素的数组每个元素都是一个指向函数的函数指针,该函数没有参数返回类型为int。

上面的声明等价于下面声明:

typedef int (*pfv)(); // 定义函数类型指针的typedef

pfv testcases[10];

函数指针的数组可以用一个初始化列表来初始化该表中每个初始值都代表了一个与数

组元素类型相同的函数例如

int lexico***pare( const string &, const string & );

int size***pare( const string &, const string & );

typedef int ( *pfi2s )( const string &, const string & );

pfi2s ***parefuncs[2] =

;// 两个等价的调用

pf***pare[ 0 ]( string1, string2 ); // 编写

((*pf***pare)[ 0 ])( string1, string2 ); // 显式

5,参数和返回类型

函数参数的类型不能是函数类型函数类型的参数将被自动转换成该函数类型的指针

例如// typedef 表示一个函数类型

typedef int functype( const string &, const string & );

void sort( string *, string *, functype );

编译器把sort()当作已经声明为

void sort( string *, string *,

int (*)( const string &, const string & ) );

上面这两个sort()的声明是等价的

注意除了用作参数类型之外函数指针也可以被用作函数返回值的类型例如

int (*ff( int ))( int*, int );

该声明将ff()声明为一个函数它有一个int 型的参数返回一个指向函数的指针类型

为int (*) ( int*, int );

同样使用typedef 名字可以使声明更容易读懂例如下面的typedef pf 使得我们能更

容易地分解出ff()的返回类型是函数指针

typedef int (*pf)( int*, int );

pf ff( int );

函数不能声明返回一个函数类型如果是则产生编译错误例如函数ff()不能如下

声明// typedef 表示一个函数类型

typedef int func( int*, int );

func ff( int ); // 错误: ff()的返同类型为函数类型

c语言中的指针问题,求解答,C语言中的指针问题,求解答

1楼 匿名用户 好像有点多此一举,直接使用rsnum就可以了。rsnum 就是数组的首地址了。 如果一定要用指针就是要申明一个指针来赋值。 c语言指针问题,求解答 2楼 伤我中国心 1, 是取值运算符,因为你要判断tt的值的情况,所以要用 2,tt 相当于 tt tt 1 这个是指针向后移动,不需要...

c语言指针和运算符优先级的问题,C语言指针和运算符优先级的问题

1楼 lost 觉悟 和 的优先级是1,而 的优先级是2,优先级小的先处理,所以不加括号的 p 4 就等价于 p 4 ,所以先看p 4 这一部分,就类似a 4 表明这是一个数组,那么 p 4 就类似 p ,表明是一个指针,由于先是数组,那么 p 4 就是一个以指针为元素的数组,同理 p 4 先是指针...

C语言中,指针占用的空间是多大?和指针类型有关系吗

1楼 指针和其指向的数据类型有关系,你可以用sizeof 来做测试 printf the size of char is d n sizeof int printf the size of char is d n sizeof char 另外,指向结构体的指针就要看具体情况了,c语言还有所谓的 对齐...