C高级编程——关于void类型的解释

时间:2022-12-31 01:15:53
  1. void关键字的使用规则是什么?

    • 如果函数没有返回值,那么应声明为 void 类型;
    • 如果函数无参数,那么应声明其参数为 void;(常省略)
    • 如果函数的参数或返回值可以是任意类型指针,那么应声明其类型为 void*
    • void 的字面意思是“无类型”,void*则为“无类型指针”(其实是任意类型指针),void不能代表一个真实的变量,void体现了一种抽象。
  2. void a;这条语句是否正确?
    不正确,并且会提示illegal use of type ‘void’错误。记住void几乎只有"注释"和限制程序的作用。

  3. 深度辨析一下void *?

    • 对于void*,任何类型的指针都可以直接赋值给它,并且无需进行强制类型转换。
      void *p1;
      int *p2;
      p1 = p2; //将int型指针赋值给void型指针,合法!
      
    • 对于void*,它赋值给其他类型的指针,需要进行显式转换
      void *p1;
      int *p2;
      p2 = (int*)p1; //
      //以下为错误用例,不能直接将void型指针赋值给int型指针
      p2 = p1; 
      
    • ANSI C 标准中,不允许对 void 指针进行一些算术运算,而在 GNU 中则允许。
      void * pvoid;
      pvoid++; //ANSI:错误
      pvoid++; //GNU:正确
      
  4. 举一个关于void*的例子?
    eg:典型的如内存操作函数 memcpy 和 memset 的函数原型。

    void * memcpy(void *dest, const void *src, size_t len);
    void * memset ( void * buffer, int c, size_t num );
    

    解释:
    任何类型的指针都可以传入 memcpymemset 中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型(参见 C 语言实现泛型编程)