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

C和C++函数指针作为函数参数的区别的相关文章

Day8 函数指针做函数参数

课堂笔记 课程回顾 多态 virtual关键字 纯虚函数 virtual func() = 0; 提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. 多继承的二义性 . 重载 重写 重定义. 实现多态的理论基础:函数指针做函数参数. vptr指针与虚函数表. 构造函数不应为虚函数 多态会降低程序的执行速度.不建议所有的函数都是虚函数. 多态时的指针步进. 多继承在项目开发中使用的比较少. linux从2.4内核升级到2.6的时候,做到了电源可以热插拔,提前将电源驱动的接口规划

C基础--函数指针作为函数的参数

#include <stdio.h> int add(int a, int b) { printf("%d\t%d\n", a, b); return a+b; } char max_ch(char *str) { int max, i; max = 0; for (i = 0; str[i] != '\0'; i++) if (str[i] > str[max]) max = i; return str[max]; } int main1(void) { int r

C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态

1,数组指针语法梳理 回顾,如何定义数组数据类型: 回顾,如何定义指针类型数组: 回顾,如何直接定义 一个指向数组类型的指针: 2,函数指针语法梳理 1)如何定义一个函数类型 2)如何定义一个函数指针类型 3)如何定义一个函数指针(指向一个函数的入口地址) [中级程序员 转 高级程序员的 必经之路] 1,函数类型做函数的参数 把函数的入口地址传过来,奇怪的效果:[多态就是这样] 函数指针 做 函数参数 思想剖析 1,数组指针语法梳理 回顾,如何定义数组数据类型: [email protected

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

函数指针与函数指针数组的使用方法

转自:http://blog.csdn.net/feitianxuxue/article/details/7300291 函数指针与函数指针数组的使用方法 函数指针: 函数指针包含函数在内存中的地址.数组名实际上就是数组的第一个元素在内存中的地址,类似地,函数名实际上也是执行这个函数任务的代码在内存中的起始地址. 函数指针可以传递给函数.从函数返回.保存在数组中.赋予另一个函数指针或者调用底层函数. 下面我们用数值算法accumulate讨论下函数指针的用法.accumulate是一种常用的ST

入职培训笔记记录--day9(1、指针函数与函数指针、函数指针数组 2、malloc memset 3、递归函数 4、结构体 5、共用体---》大小端 6、枚举)

1.指针函数与函数指针.函数指针数组 指针函数:返回值为指针的函数 char *fun() { char str[] = "hello world"; return str; } int main() { char *p = fun(); puts(p); return 0; } 编译时,会出现警告,返回了一个已经被释放掉的内存空间的首地址解决方法:1.static 2.char *str = "hello world"; 3.malloc 注意:使用完后要free

函数指针、函数指针数组

参考:百度百科 |函数指针|词条. 指针_函数,就不说了.自己感觉就是So-easy的.[ 声明格式:returnType *Function(arguments); ] 重点是 函数指针,以及突然冒出来的 函数指针数组;(特别说明,我习惯先写代码,再写注释:情况A:代码在左,注释向右.情况B:代码在上,注释在下.) 函数指针,我形象的描述 函数<-指针,(文中一切有问题请指正,谢谢).[声明格式: returnType(*pointer)(arguments); ] 举例: int fun(i

函数指针,函数指针数组,函数返回值为函数指针

函数的名字就是函数的首地址:定义函数指针; int (*p)(int ) p为函数指针变量名字,int 为函数的返回值类型为int型:(int)为函数的形参类型为int型, 注:因为优先级所以要用(*p),否则就会p先和后面的()结合为int*p(int),意思就变为p(int)函数的返回值为int* 注:main2()函数中   int (*p[])(int ,int )  为一维数组,下面写错了, #include<stdio.h> #include<stdlib.h> int

新手,对函数,函数指针,回调函数, 函数指针作为函数的返回值和block的一些见解

很多初学者,学c语言时,看到函数都觉得难,我也是,一开始觉得函数太难了,后来慢慢就理解了 第一:函数 在c语言中最简单的函数一般有四种: 1, 无返回值, 无参数. 2, 无返回值,有参数. 3, 有返回值,无参数. 4, 有返回值,有参数 1, 无返无参  定义方式:      void 函数名(); 一般不怎么用这种形式的函数,可用来输出,打印 void functionOne() { printf("无返回值,无参数"); // 没有返回值不能写return } int main