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++更加严格。
时间: 2024-11-07 19:02:32