我想初始化一个函数指针,使其为null。这两种方式中哪一种更受欢迎?
void (*Pointer)(void) = NULL;
或
void (*Pointer)(void) = (void (*)(void))0;
答案 0 :(得分:3)
0
可隐式转换为任何指针类型。虽然编译器实现NULL
的方式取决于。
在您的代码中,您只需编写
即可 void (*Pointer)(void) = 0;
但它不可移植,请写void (*Pointer)(void) = NULL;
答案 1 :(得分:2)
标准(ISO / IEC 9899:2011)说:
§6.3.2.3指针
¶1指向
void
的指针可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向void
并再次返回的指针;结果应该等于原始指针。¶2对于任何限定符 q ,指向非 q - 限定类型的指针可能会转换为指向 q 的指针 - 该类型的合格版本;存储在原始指针和转换指针中的值应相等。
¶3值为0的整型常量表达式,或者类型为
void *
的表达式,称为空指针常量。 66)如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与不等于指向任何对象或函数的指针进行比较。¶4将空指针转换为另一种指针类型会产生该类型的空指针。任何两个空指针都应该相等。
...
¶8指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再返回;结果应该等于原始指针。如果转换的指针用于调用类型与引用类型不兼容的函数,则行为未定义。
66)宏
NULL
在<stddef.h>
(和其他标头)中定义为空指针常量;见7.19。§7.19通用定义
<stddef.h>
¶3宏是
NULL
扩展为实现定义的空指针常量; ...
所有这些加起来说,问题中使用的任何一种符号都是有效的,而且它们(和其他类似的表达式)是等价的,并且没有问题。
void (*Pointer)(void) = NULL;
void (*Pointer)(void) = (void (*)(void))0;
void (*Pointer)(void) = 0;
请注意,标准没有明确说明您可以将指向对象类型的指针转换为指向函数类型的指针,反之亦然,或者保证可以使用往返。请记住,曾经存在早期Intel机器的内存模型,其中数据(对象)指针与函数指针的大小不同 - 并且仍然可以在其他机器上发生(IBM AS / 400及其继承者和后继者是另一个例子)。 p>
您还可以null pointer从http://c-faq.com/开始研究问题和答案。
答案 2 :(得分:1)
NULL被定义为空指针常量。空指针常量可用于将任何指针(数据指针或函数指针)初始化为正确类型的空指针,因此分配NULL就可以了。
0也可以工作,因为0也是一个空指针常量。那么0L,(13 * 12-156)和许多其他方式。 NULL是首选,因为它显示了分配空指针的意图。
下面这一行只是不必要的工作。