0

我试图了解有什么问题:

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

据我了解,问题是我无法将指针传递为

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

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

4

4 回答 4

1

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

于 2013-08-08T18:02:13.407 回答
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.
于 2013-08-08T18:18:28.717 回答
0

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

于 2013-08-08T18:08:25.827 回答
0

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

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

其次,它可以作为 cast 语句的一部分单独出现:(int *) Y这意味着 的内容Y将被解释为指向整数的指针。

第三,可能它最迟钝的用法是指示指向函数的指针。例如,

int (*func_ptr_ret_int)(void);

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

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

最后,我建议您推迟 usingtypedef语句,直到您可以“本机”编写声明。也就是说,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.

希望这可以帮助。

于 2013-08-08T18:39:55.533 回答