C用指针参数定义函数指针

时间:2013-08-08 17:57:47

标签: c pointers function-pointers

我试图理解错误:

typedef *void (*pfun)(**int, *float);

据我所知,问题在于我无法将指针作为

传递给函数
typedef *void (*pfun)(int, float);

不会产生错误,但我不知道为什么会这样。

4 个答案:

答案 0 :(得分:1)

您的意思是void*int**float*

答案 1 :(得分:1)

您没有在以下表达式中使用有效的C / C ++语法进行指针声明:

typedef *void ( *pfun )( **int, *float );

召回:点数按以下格式声明:

datatype *identifier

...因此您的类型定义应写为:

typedef void* (*pfun)( int**, float* );

备注:声明指针时间距无关紧要,因此以下内容是等效的:

datatype *identifier
datatype* identifier

...但是你会发现大多数程序员都认为做一个第一个指针声明是一个好习惯,因为它传达了标识符是指向数据类型的指针。当在一行上声明多个指针时,这种做法变得更加明显。例如:

int *ptr1, *ptr2, *ptr3; // Declaring 3, valid, pointers to integers.
int* ptr1, ptr2, ptr3; // Declares 1, valid, pointer to an integer and 2 other integers.

答案 2 :(得分:0)

typedef void *(* pfun)(int ** i,float f);这意味着函数指针具有int * ,float *作为参数并返回void *。但在你的帖子中,解引用操作符不在适当的位置。

答案 3 :(得分:0)

这对新程序员来说是一个很好的问题。去引用运算符在定义指针时有多种用途。

首先,它可以放在变量名之前。这意味着变量是指向数据类型的指针,例如:int *X;表示X指向包含整数值的RAM。

其次,它可以作为演员声明的一部分独立存在:(int *) Y这意味着Y的内容将被解释为指向整数的指针。

第三,可能最麻烦的用法是指示一个函数的指针。例如,

int (*func_ptr_ret_int)(void);

向C声明变量func_ptr_ret_int指向不接受任何参数并返回整数的函数。在此示例中,func_ptr_ret_int尚未分配值,因此应假定它包含垃圾。

第四种用法是指示一个双指针:int **Z;声明Z指向另一个指针(未命名),该指针又指向一个整数。

最后,我建议您推迟使用typedef语句,直到您可以“本机”编写声明。也就是说,typedef仅定义新数据类型不分配存储或分配值。

考虑到这一点,你的两个陈述可以编码为:

void (*pfun1)(int **, float *); // pfun1 points to a function that returns void
                                // and uses a double ptr to inf and ptr to float


void *(*pfun2)(int, float);     // pfun2 points to a function that returns a void
                                // pointer and accepts int and float parameters.

希望这有帮助。