除了使代码更具惯用性之外,C&C的无效*是否有任何其他目的?

时间:2018-01-06 00:20:26

标签: c void-pointers

C' void*是否以编译器优化等形式提供了一些好处,或者它只是char*的惯用等价物?即如果C标准库中的每个void*都被char*替换,那么除了代码易读性之外是否会损坏任何内容?

3 个答案:

答案 0 :(得分:5)

在原始K& R C中没有void *类型,char *被用作通用指针。

void *有两个主要目的:

  1. 当指针被用作通用指针时,它就清楚了。以前,您无法判断char *是否被用作指向实际字符缓冲区的指针或作为通用指针。

  2. 它允许编译器在尝试取消引用或对泛型指针执行算术时捕获错误,而不是先将其强制转换为适当的类型。 void *值不允许执行这些操作。不幸的是,一些编译器(例如gcc)默认允许对void *指针进行算术运算,因此它不是那么安全。

答案 1 :(得分:3)

C与char *之后的void *之前的>>nano wynik.txt 作为通用指针类型相处得很好。所以显然不是绝对必要的。但编程语言是沟通 - 不仅告诉编译器要做什么,而且告诉其他人阅读程序的目的。任何让语言更具表现力的东西都是好事。

答案 2 :(得分:1)

  

除了使代码更具惯用性之外,C的无效*是否有任何其他目的?

     

如果C标准库中的每个void*都被char*替换,除了代码清晰度之外是否会损坏任何内容?

C11介绍_Genric。因此,_Generic(some_C_standard_library_function()) ...代码的编译方式会有很大不同,具体取决于返回类型是void *char *int *等等。