我试图这样做:
int (*p)(void);
int *i;
...
p = (int *(void))i;
但它导致语法错误:
error: cast specifies function type
这里有什么问题?
答案 0 :(得分:3)
在这种情况下你应该尊重错误。您不能将指向函数的指针转换为int指针或其他方式。这可能会导致未定义的行为。
如果你坚持,那么语法应该是:
p = (int (*)(void))i;
答案 1 :(得分:3)
我是一个指向整数的指针,p是一个函数指针返回和int并且不带参数。它们不以任何方式,形状或形式兼容/浇铸。
答案 2 :(得分:2)
编译器说的是什么。 int (*p)(void)
是一个函数指针声明(指向返回int的函数的指针)。 int *i;
是标量指针声明(指向int的指针)。你不能把一个投入另一个。
答案 3 :(得分:1)
如果你必须这样做(我绝不是说你应该这样做)那么:
typedef int (*fp)(void);
int *i;
fp p;
...
p = (fp)((void*)i);
答案 4 :(得分:1)
写
p = (int (*)(void))i;
以下是一个例子:
#include <stdio.h>
int f(){
printf("test\n");
return 0;
}
int main()
{
int (*p)(void);
int *i;
i = (int*)f;
p = (int (*)(void))i;
printf("i=%p\n", i);
printf("p=%p\n", p);
((int (*)(void))i)(); //here, it will call f()
return 0;
}
答案 5 :(得分:0)
*i
指向一个简单的整数,而*p
是指向没有参数返回整数的函数的指针。因此,这两个类型完全不同,因为你说p
应该指向一个返回int的函数,你不能告诉它指向一个int。
但是,您可以尝试将两者都包装在一个联合中,如下所示:
union u {
int *i;
int (*p)(void);
};
int f(void){
return 5;
}
int main(int argc, char *argv[]) {
union u myU;
int a=6;
myU.i=&a;
myU.p=&f;
return 0;
}
请注意,分配&f
后,您只需拨打myU.p()
即可。但是如果你遗漏&f
的作业并在之后调用myU.p()
,则会导致未定义的行为(即程序崩溃)。
答案 6 :(得分:0)
你没有。也就是说,除非你比编译器更清楚知道int *
中存储的指针首先来自int (*p)(void)
。正如其他人所说,第二种类型是一个指向函数的指针,该函数不带参数并返回一个int。第一种类型是指向整数的简单指针(如果被视为数组,则为多于一个整数)。