• 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); //错误

  • 相关阅读:
    nodejs安装express及ejs模板
    nodejs开启服务器
    php 汉字转拼音
    使PHP像js一样链式写法
    apache出现\xef\xbb\xbf
    更改CI自定义类构造函数的传参方式
    DEV ComBoxEdit实现模糊检索数据
    微软一站式示例代码库(中文版)20110924版本, 新添加ASP.NET, Windows Base, Silverlight, WinForm等20个Sample
    Windows Azure 系列分享一:开始基于Windows Azure的开发与部署所需的概念和软件
    Windows Azure 系列分享二: Worker Role & Web Role
  • 原文地址:https://www.cnblogs.com/raichen/p/5496694.html
Copyright © 2020-2023  润新知