为什么C/C++中函数名传参时加不加取地址运算符&效果一致?
函数名传参加不加
&效果一致的原因 这个是C/C++标准定义的函数类型隐式转换规则导致的,具体逻辑如下:
- C语言标准明确规定:除非函数名作为
&、sizeof、_Alignof运算符的操作数,否则所有函数类型的表达式都会被自动隐式转换为指向该函数的指针。 - 你直接写
sum作为参数传递时,sum不属于上述例外情况,会被编译器自动转换成&sum,也就是类型为void (*)(int, int)的函数指针,和fun要求的第三个参数类型完全匹配。 - 你显式写
&sum时,是直接通过取地址运算符拿到函数的入口地址,得到的指针值、类型和隐式转换出来的完全没有区别,所以两种写法的运行效果完全一致。
补充小知识:不止传参时两种写法等价,调用函数指针时加不加
*也等价,你示例里的(*ptr)(a,b)完全可以直接写成ptr(a,b),运行结果一模一样,逻辑也是类似的:函数指针在用于函数调用时会被自动转换为对应的函数类型。
另外注意你示例代码有语法问题:引入的是C标准库的stdio.h,但sum函数里用了C++的cout输出,实际编译会失败,要么把输出改成printf("%d", a + b);,要么引入<iostream>头文件、加using namespace std;声明。
内容的提问来源于stack exchange,提问作者Daniel H Sagarra
相关产品推荐
相关产品推荐

