关于C语言函数指针的问题?
#include<stdio.h>voidprint(){printf("helloworld!\n");}intmain(void){void(*fuc)();fuc=...
#include <stdio.h>
void print()
{
printf("hello world!\n");
}
int main(void)
{
void (*fuc)();
fuc = print ;
fuc(); // (*fuc)()
}
上面这段代码,最后的那个fuc()函数,为什么写fuc()和 (*fuc)()都是对的? 展开
void print()
{
printf("hello world!\n");
}
int main(void)
{
void (*fuc)();
fuc = print ;
fuc(); // (*fuc)()
}
上面这段代码,最后的那个fuc()函数,为什么写fuc()和 (*fuc)()都是对的? 展开
展开全部
首先,编译器对于很多操作都有隐式转换.
其次,函数指针指向的是编译后的函数代码(机器指令)的首地址.
因此你用星号操作指针难道要访问指令吗?函数唯一的访问方式就是调用,因此编译器做了默认处理,无论有没有星号都是调用函数,这种由编译器自动决定操作叫隐式转换.(其他编译器有可能会报错)
PS:尽量不要利用隐式转换而偷懒,因为依赖编译器的自动功能会存在安全隐患,因为不同的编译器隐式转换有所不同,代码还是明确点比较安全.因为即便更新编译器版本你的程序也不会出问题.
其次,函数指针指向的是编译后的函数代码(机器指令)的首地址.
因此你用星号操作指针难道要访问指令吗?函数唯一的访问方式就是调用,因此编译器做了默认处理,无论有没有星号都是调用函数,这种由编译器自动决定操作叫隐式转换.(其他编译器有可能会报错)
PS:尽量不要利用隐式转换而偷懒,因为依赖编译器的自动功能会存在安全隐患,因为不同的编译器隐式转换有所不同,代码还是明确点比较安全.因为即便更新编译器版本你的程序也不会出问题.
展开全部
你好,
我也一脸茫然,于是去百度了:C语言-函数指针与函数名的区别***
得出结论:
函数名的使用基本等价于函数指针,函数名、取地址&、取内容*得到的都是函数的地址。
函数名也可以(* <函数名>)()来调用,只是这种方法读写都不方便,所以被简化了。
函数名和数组名实际上都不是指针,但是,在使用时可以退化成指针,即编译器可以帮助我们实现自动的转换。
题主可以自己百度一下:C语言-函数指针与函数名的区别***
果然我还是很无知的。
祝你生活愉快。
我也一脸茫然,于是去百度了:C语言-函数指针与函数名的区别***
得出结论:
函数名的使用基本等价于函数指针,函数名、取地址&、取内容*得到的都是函数的地址。
函数名也可以(* <函数名>)()来调用,只是这种方法读写都不方便,所以被简化了。
函数名和数组名实际上都不是指针,但是,在使用时可以退化成指针,即编译器可以帮助我们实现自动的转换。
题主可以自己百度一下:C语言-函数指针与函数名的区别***
果然我还是很无知的。
祝你生活愉快。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询