zoukankan      html  css  js  c++  java
  • 深入理解C语言-深入理解void

    void的字面意思是"无类型",void *则为"无类型指针",void *可以指向任何类型的数据

    void含义

    void几乎只有注释和限制程序的作用,定义一个void变量没有意义
    void的真正作用在于

    1. 对函数返回的限定
    2. 对函数参数的限定
      在C语言中,void *可以接受任意类型指针的赋值,而不需要进行内存强制转换
    void *p1;
    int *p2;
    p1 = p2;
    

    但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为无类型可以包容有类型,而有类型则不能包容无类型。以下语句在编译时候就会报错

    void *p1;
    int *p2;
    p2 = p1;
    

    void的理解

    如果函数没有返回值,那么应声明为void类型

    在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回int类型值处理
    但在实际编程中,为了代码的可阅读和可维护,无返回值的时候要加上void

    如果函数无参数,那么应声明其参数为void

    虽然很多时候,在函数没有参数的时候,需要加上void
    在C有的编译器中,如果不添加void,那么此函数会接受任意类型参数
    所以,在函数不接受任何参数的时候要用void进行说明

    小心使用void指针类型

    在不同的C标准中,处理void指针的算法操作有着不一样的宽容度
    ANSI认为,一切对void指针的运算操作都是非法的,会报错
    而GNU则认为,void指针的算法操作和char *保持一致
    为何兼容二者的思想,一般会对void指针进行转化,然后再对其操作

    void * pvoid;
    (char *)pvoid++; //ANSI:正确;GNU:正确
    (char *)pvoid += 1; //ANSI:错误;GNU:正确
    

    如果函数的参数可以是任意类型指针,那么应声明其参数为void *

    典型的如内存操作函数memcpy和memset的函数原型分别为:

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

    任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型
    这两个函数的返回值也是void *

    void不能代表一个真实的变量

    void代表了一种抽象,而不是实实在在存在的变量
    因此,不能定义一个void变量

    void的使用

    数据类型的封装

    int InitHardEnv(void **handle);
    

    典型的如内存操作函数memcpy和memset的函数原型分别为

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

    void修饰函数返回值和参数,仅表示无

    如果函数没有返回值,那么应该将其声明为void型
    如果函数没有参数,应该声明其参数为void

    int function(void)
    {
        return 1;
    }
    

    void指针的意义

    C语言规定只有相同类型的指针才可以相互赋值
    void*指针作为左值用于接收任意类型的指针
    void*指针作为右值赋值给其它指针时需要强制类型转换

    int *p1 = NULL;
    Char *p2 = (char *)malloc(sizoeof(char) * 20); 
    

    不存在void类型的变量

    C语言没有定义void究竟是多大内存的别名

  • 相关阅读:
    Go语言实现:【剑指offer】剪绳子
    delphi10.3安装使用mySQL
    uniGUI学习之把窗口分成左,右边(上下)三部分,并且在运行中可以动态调节其相对大小(36)
    uniGUI学习之UniStringGrid(35)
    uniGUI之主窗口折叠UI之UniTreeMenu(32-2)
    好网站
    ios图片
    ios启动图的相关问题
    自学php
    Parse error: syntax error, unexpected $end in diguoclassfunctions.php on line 1246
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664772.html
Copyright © 2011-2022 走看看