C 要求澄清类型转换

C 要求澄清类型转换,c,casting,C,Casting,编辑:好吧,我想我现在明白了: 案例1: #include <stdio.h> #define function(_a) ((_a)*2) int main () { int (*func)(int) = function(0); // function(0) = 0 func(7); ... } #包括 #定义函数(_a)(_a)*2) int main(){ int(*func)(int)=函数(0);//函数(0)=0 func(7); ... } 语法是

编辑:好吧,我想我现在明白了:

案例1:

#include <stdio.h>
#define function(_a) ((_a)*2)

int main () {
    int (*func)(int) = function(0); // function(0) = 0
    func(7);
...
}
#包括
#定义函数(_a)(_a)*2)
int main(){
int(*func)(int)=函数(0);//函数(0)=0
func(7);
...
}
语法是可以的,但是,在运行时,main将尝试访问地址NULL,这将导致unix环境中windows中的软件崩溃/分段错误

案例2:

#include <stdio.h>
#define function(_a) ((_a)*2)

int main () {
    int (*func)(int) = function;
    func(7);
...
}
#包括
#定义函数(_a)(_a)*2)
int main(){
int(*func)(int)=函数;
func(7);
...
}
编译错误,因为“函数”实际上是一个宏,而不是一个实际的函数,所以可以说,指向函数的指针不能指向它

案例3(正确代码):

#包括
int函数(int_a){return((_a)*2);};
int main(){
int(*func)(int)=函数;
func(7);
...
}

这次我做对了吗?

int(*func)(int)=0
表示
func
是一个函数指针,即指向函数的
指针,因此
(*func)
返回一个
整数,即语句中的第一个
int
,并将
整数作为参数,即
(int)
。将
int(*func)(int)
赋值给
0
意味着函数指针被赋值给指向
NULL

int(*func)(int)=0
表示
func
是一个函数指针,即指向函数的
指针,因此
(*func)
返回一个
整数,即语句中的第一个
int
,并将
整数作为参数,即
(int)
。将
int(*func)(int)
赋值给
0
意味着将函数指针赋值给指向
NULL

这一行不是您所认为的

 int (*func)(int) = 0;
它是一个变量(称为func),指向一个函数的指针,该函数的签名为
intsomename(int)
,您将其设置为0

为了更好地理解这一点:

int myfunction(int a) { return 5;}
这样就行了

 int (*func)(int) = myfunction;

这条线不是你想象的那样

 int (*func)(int) = 0;
它是一个变量(称为func),指向一个函数的指针,该函数的签名为
intsomename(int)
,您将其设置为0

为了更好地理解这一点:

int myfunction(int a) { return 5;}
这样就行了

 int (*func)(int) = myfunction;

它是一个初始化为
NULL
的函数指针。好吧,但是调用函数时会发生什么,例如,
func(7)
?它是一个初始化为
NULL
的函数指针。好吧,但是调用函数时会发生什么,例如,
func(7)
?同样值得注意的是,在最后一行代码之后,可以使用
func(10)调用该函数我明白了,我完全错了,实际上,原始代码是:
int(*func)(int)=函数(0)和函数是这样定义的:
#定义函数(_a)(_a)*2)
但它仍然没有意义,因为
函数(0)
返回NULL<代码>函数(0)
相当于
0*2
,即
0
。这不是你期望的答案吗?例如,如果
int(*func)(int)=function
,其中函数定义为
int function(int num){return num*2;}
,并且如果执行
(*func)(10)
您应该得到
20
@user1965208-在这种情况下,您不能使用
#define
来创建指针。同样值得注意的是,在最后一行代码之后,可以使用
func(10)调用函数我明白了,我完全错了,实际上,原始代码是:
int(*func)(int)=函数(0)和函数是这样定义的:
#定义函数(_a)(_a)*2)
但它仍然没有意义,因为
函数(0)
返回NULL<代码>函数(0)
相当于
0*2
,即
0
。这不是你期望的答案吗?例如,如果
int(*func)(int)=function
,其中函数定义为
int function(int num){return num*2;}
,并且如果执行
(*func)(10)
,您应该得到
20
@user1965208-在这种情况下,您不能使用
\define
来创建指针。感谢您的回复,请看我对第一个答案的评论:)谢谢你的回复,请看我对第一个答案的评论:)