• ((void *) 0)的含义和void的一些细节


    一、在c语言中,0是一个特殊的值,它可以表示:整型数值0,空字符,逻辑假(false)。表示的东西多了,有时候不好判断。尤其是空字符和数字0之间。

    为了明确的指出,0是空字符的含义,用用到了: ((void *) 0) 这个表达式。表示把0强制转换为空字符,不管以前代表的什么含义。

    在c的标准头文件中,就是这样定义NULL的:

    #define NULL     ((void *) 0)

    关于void在指针的应用:

    void表示“无类型”,void *表示无类型指针。在定义指针的时候,必须声明指针的类型,因为类型决定了指针移动的字节数。

    例题:

    double d=3.14;
    double *dptr=&d;
    int *iptr=dptr;   //错误,double和int占用不同的字节,编译报错。
    double d=3.14;
    double *dptr=&d;
    void *vptr=dptr  //正确,无类型指针可以接受任何类型的指针。

    二、那么这种“无类型的指针”能进行取值操作吗?可以,但是要注意:

    下面的做法是正确的:

    #include <stdio.h>
    int main(int argc, char *argv[])
    {
        double d=3.14;
        double *dptr=&d;
        void *vptr=dptr;
        printf("vptr's value %f.
    ",*((double*)vptr));
        int i=10;
        vptr=&i;
        printf("vptr's value %d.
    ",*((int*)vptr));
    
        return 0;
    }

    *((double*)vptr)的含义是:把vptr强制转换为double类型指针,再用*号取值。

    因为:*为单目运算符,优先级由右至左,所以去掉外层括号也是可以的。*((double *)vptr) 等价  *(double *)vptr

    三、不能把“无类型指针”赋给“有类型指针”,比如:可以说,“男人女人都是人”,但不能说,“人是男人”或者“人是女人”。看例题:

    void *vptr;
    double *dptr
    
    dptr=vptr      //错误,不能把无符号指针赋给有符号指针
  • 相关阅读:
    python-ConfigParser模块【读写配置文件】
    MinGW安装和使用
    mybatis批量操作
    SSM框架的简单搭建
    idea录制宏
    数据导出,导入
    JS中调用android和ios系统手机打开相机并可选择相册功能
    get请求中url传参中文乱码问题
    hibernate criteria中Restrictions的用法
    hibernate报错
  • 原文地址:https://www.cnblogs.com/litifeng/p/7635220.html
Copyright © 2020-2023  润新知