顺便聊一下基础知识 | 每日一面(11)

读者:我总算弄清除函数指针的声明方法了, 但怎样才能初始化呢?

小林:用下面这样的代码

extern int func();

int (*fp)() = func;

当一个函数名出现在这样的表达式中时, 它就会 “蜕变” 成一个指针 , 这有点类似数组名的行为。通常函数的显示声明需要事先知道。因为此处并没有隐式的外部函数声明 (初始式中函数名并非一个函数调用的一部分)。

读者:声明 struct x1 { …}; 和 typedef struct { …} x2; 有什么不同?

小林:第一种形式声明了一个 “结构标签”; 第二种声明了一个 “类型定义”。主要的区别是在后文中你需要用 “struct x1” 引用第一种, 而用 “x2” 引用第二种。也就是说, 第二种声明更像一种抽象类新 —– 用户不必知道它是一个结构, 而在声明它的实例时也不需要使用 struct 关键字。

正文完