zoukankan      html  css  js  c++  java
  • void与void *

    void关键字的使用规则:

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

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

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

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

    void真正发挥的作用在于:

    • 对函数返回的限定
    • 对函数参数的限定

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

    我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为void类型。这既是程序良好可读性的需要,也是编程规范性的要求。另外,加上void类型声明后,也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己。

    规则二:如果函数无参数,那么应声明其参数为void

    规则三:如果函数的参数可以是任意类型指针,那么应声明其参数为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 swap(void* lsh, void* rhs, size_t size)
    {
        ;//
    }

    有了这样一个函数,那么如果想要交换两个变量,那就可以:

    swap(&ai, &bi, sizeof(int));
    swap(&af, &bf, sizeof(float));

    小心使用void *

    众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型

    float *p1;
    int *p2;
    p1 = (float *)p2;

    而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:

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

    void*和其他指针一样,都是占同样大小的内存空间,唯一和其他指针不同的就在于你不能对void*进行解引用,看起来其他类型的指针都可以用void*来代替,只要在解引用之前把它转换为相应类型的指针就OK了!

    不能对void指针进行算法操作,即下列操作都是不合法的:

    void * pvoid;
    pvoid++; //ANSI:错误
    pvoid += 1; //ANSI:错误

    ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。

    规则四:void不能代表一个真实的变量

    下面代码都企图让void代表一个真实的变量,因此都是错误的代码:
    void a; //错误
    function(void a); //错误

  • 相关阅读:
    dajngo ORM查询中select_related的作用,博客主题的定制,从数据库中按照年月筛选时间
    Django数据查询中对字段进行排序
    Django验证码实现
    django登录注册验证之密码包含特殊字符,确认密码一致实现,Form验证
    django模板传入参数的处理方式与反向生成url
    在django中使用循环与条件语言
    django的模板的继承与导入
    sublime3故障收集emmet无法安装pyv8
    [SQL SERVER系列]之嵌套子查询和相关子查询
    [SQL SERVER系列]读书笔记之SQL注入漏洞和SQL调优
  • 原文地址:https://www.cnblogs.com/raichen/p/5496694.html
Copyright © 2011-2022 走看看