C语言-----函数声明,调用 剖析

当我在某段代码中看到,这行代码的时候

(*(void(*)())0);

我身上的每一个细胞都对它发出了疑问? what's f**? 这啥玩意

我开始逐渐疑惑和愤怒,因没有看懂这句话而疑惑,同样为我使用了挺长时间C语言还没看懂而愤怒。但很快,代替它们的便是满脑子的好奇心。

我开始认真地尝试肢解这句代码。我大概猜测,它是一个关于指针函数相关的东西,很明显,它有 * 号,最后有一对()。

随后,我尝试将最后的小括号 去掉,它变成了 :

(*(void(*)())0) 

我开始怀疑,它就是函数名字,不过长得有点不尽如人意而已,不过我并不嫌弃它。

紧接着我将去掉 最左边 *号 和最外层的括号,它成了:

void(*)()0

现在它貌似长得有点像函数的定义哈,没错他就是把 0 强制转换为 一个指针函数。

那我们可以这样类比  我们声明 一个 指针函数 :

扫描二维码关注公众号,回复: 16006299 查看本文章
void(*fp)(); 

按我们如何调用 函数呢 ,那不就是:

(*fp)();

同样这里的 fp就可以等同于 上面的 void(*)()0, 那  (*(void(*)())0); 就仅仅是一个 函数的调用语句而已。

c语言引入 typedef 关键字后 可以更加清晰的解决这个问题

首先定义一个 叫 func 的指针函数类型

typedef void (*func)();  

接下来我们 调用这个函数:

(*(func)0) (); 

将0转换为 func这个类型,而func就代表的一个指针函数类型,即强转 (func)0 , 然后再 取指针指向的值 *(func)0, 最终加上() 调用此函数。

但实际上并没有人会向上面这样去使用它,因为调用0的指针函数没有意义。

一般我们在需要把函数作为参数传递时使用,常见得可以用来实现 回调函数

首先 定义一个函数指针类型:

typedef void (*func)();

再定义一个函数:

int test_func(func my_func)
{
    (*my_func)();   //调用传入进来的函数
}

test_func 一般会被叫做相应的注册函数,定义在其他模块或上层应用。

猜你喜欢

转载自blog.csdn.net/qq_37755518/article/details/126622387