首页 > 代码库 > 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++函数指针作为函数参数的区别