(void*)和(void(*)(参数类型))cast之间有什么区别?

양진혁*_*양진혁 7 c c++ pointers

void funcPtr(int a);

int main(){
   int k=1;
   void (*funcPtr2)(int);

   funcPtr2 = (void*)(funcPtr);
   // funcPtr2 = (void(*)(int))(funcPtr);

   (*funcPtr2)(k);
   return 0;
}

void funcPtr(int a){
   printf("%d", a);
}
Run Code Online (Sandbox Code Playgroud)

(void*)(void(*)(argument type)函数指针类型转换有什么区别?

因此,它不会发生警告.

这是错的吗?关于(void*)型铸造

P.P*_*.P. 7

这是错的吗?about(void*)类型转换

是的.

C标准不允许将函数指针转换为对象指针或它们之间的赋值.如果您提高了编译器警告级别,则可能会收到警告/错误,例如编译:

gcc -Wall -Wextra -pedantic-errors -std=c11 file.c
Run Code Online (Sandbox Code Playgroud)

我不确定你为什么要考虑转换函数指针.如果函数指针类型与函数匹配,只需指定它:

 funcPtr2 = funcPtr;
Run Code Online (Sandbox Code Playgroud)

在旁边:

您可以像函数一样使用函数指针:

 funcPtr2(k);
Run Code Online (Sandbox Code Playgroud)

并使用标准原型,main例如:

int main(void)
Run Code Online (Sandbox Code Playgroud)