我试图了解有什么问题:
typedef *void (*pfun)(**int, *float);
据我了解,问题是我无法将指针传递为
typedef *void (*pfun)(int, float);
不会产生错误,但我不知道为什么会这样。
我试图了解有什么问题:
typedef *void (*pfun)(**int, *float);
据我了解,问题是我无法将指针传递为
typedef *void (*pfun)(int, float);
不会产生错误,但我不知道为什么会这样。
你的意思是void*
, int**
和float*
?
您没有在以下表达式中使用有效的 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.
typedef void* (*pfun)(int **i, float f); 这意味着具有 int *, float * 作为参数并返回 void * 的函数指针。但是在您的帖子中,取消引用运算符不在适当的位置。
对于新程序员来说,这是一个很好的问题。取消引用运算符在定义指针时有多种用途。
首先,它可以放在变量名之前。这意味着该变量是指向数据类型的指针,例如: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.
希望这可以帮助。