首页 > 代码库 > C和C++函数指针作为函数参数的区别
C和C++函数指针作为函数参数的区别
1.函数作为参数加*和不加*
例1:
void print(int i){ printf("not parameter%d\n",i); }void debugfun(void <span style="color:#ff0000;">(*funprint</span>)(int)){ funprint(2); return; }
main(){ debugfun(print);}
输出:
not parameter2
例2:(去掉红色部分*号)
void print(int i){ printf("not parameter%d\n",i); }void debugfun(void <span style="color:#ff0000;">(funprint</span>)(int)){ funprint(2); return; }
main(){ debugfun(print);}
输出一样为:
not parameter2
结论:函数指针作为形参和不加*意义一样
2.C和C++之间对于函数里面类型的严格程度
C例子:
typedef struct Register { int WR0; int WR1[4]; int WR2[4]; int WR3[4]; int WR4; int WR5; }Register;
void print(<span style="color:#000000;">Register reg</span>) { printf("数据项为%d \n",reg.WR0); }
void ListTraverse(void (*visit)(<span style="color:#ff0000;">Register</span>)) {
Register reg;
reg.WR0 = 2; visit(reg); }
main(){ ListTraverse(print);}
输出:
数据项为2
如果去掉红色部分Register,而红色部分visit(reg);改成visit(reg.WR0);后,居然不报错还能正确输出;
因为编译器自动将从reg.WR0开始的内容作为一个Register类型的起点(长度为sizeof(Register))转换成Register类型作为函数的形参
以下的例程可以证明我上述说法
若改成
void ListTraverse(void (*visit)()) {
Register reg;
reg.WR4 = 10; visit(<span style="color:#ff0000;BACKGROUND-COLOR: #f0f0f0">reg.WR4</span>); }
输出为:
数据项为10
明显之前的reg.WR4单元的内容成为了新转换成的Register类型的起始单元
C++例程:
按照C例程里面的代码用C++编译器编译,若指针函数里面的参数不加类型标识,程序直接报错
综上所述,C和C++在函数指针作为函数参数对函数的形参要求上,C++更加严格。
C和C++函数指针作为函数参数的区别
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。