码迷,mamicode.com
首页 > 编程语言 > 详细

C和C++函数指针作为函数参数的区别

时间:2014-10-09 16:18:18      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   ar   数据   sp   2014   log   代码   

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++函数指针作为函数参数的区别

标签:style   blog   color   ar   数据   sp   2014   log   代码   

原文地址:http://blog.csdn.net/xiao_ping_ping/article/details/39927837

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!