zoukankan      html  css  js  c++  java
  • void和void*指针的一些理解

    void 和 void* 指针分别表示无类型和无类型指针。

    void 的作用是限制:

      1,函数无返回值。

      2,函数无参数。

      当函数的返还值无参数的时候一定要加上 void ,因为在缺省的状态下函数的返还值是 int ,并且如果不需要的时候就一定要将他声明成 void 类型这样看着更明显。当函数无参数的时候在声明的时候也要加上 void 的这也是一个好习惯,增强了可读性,当然在 K&R C 中是允许在声明的时候省去参数的。

    void 类型的和指针可以接受任何类型的类型的指针的赋值(但是不代表这个void类型的指针转化成相应的指针了,如果需要按照原指针的类型使用用,还是需要进行强制类型转换)。

    #include<stdio.h>
    int main()
    {
        int a=1;
        int *b;
        b=&a;
        void *c;
        c=b;
        printf("%d
    ",*(int *)c);
    }

    在void指针存储的是结构指针需要注意的是看如下代码片段:

    if( (*(STRUCTNAME *)p).next == NULL )
        {
            return FALSE;
        }
        else
        {
            free=(*(STRUCTNAME *)p).next;
            (*(STRUCTNAME *)p).next= ( *(STRUCTNAME *)( (*(STRUCTNAME *)p).next ) ).next;
        }

    void *的作用

       你可以把 void * 指针看作是水果,水果有很多种类,可以是苹果,香蕉,但是不能说水果香蕉,因为还可能是苹果,但是你可以说香蕉是水果。同样的其他类型的指针可以直接赋值给 void * 指针,但是void* 指针就不可以直接赋值给其他类型指针,这里就需要进行类型强制转换,类型强制转换可以躲避过编译器错误的检测。所以在使用强制类型转化的时候需要确定这个转换是正确的。

      void * 指针是一种未知类型的指针,它在使用的时候不受限制,他可以用来存储任何类型的指针,这样得到的类型就可以按照你的需要进行转换。

      因为 void * 指针其实可以说是没有类型,就是编译器不知道指针所指向对象的长度。

      void * 指针不能进行副引用,就是不能取得 void *指针的内容。

      void * 指针在 ASNI 标准上不准许进行算法操作(如:void *a; int *b; a=b; *a=2; //错误) ASNI C 坚信进行算法操作一定要知道指向数据类型的大小,但是在 GNU 中就是可以的。 GNU 支持了更多的语法,但是为了可移植性,在编写代码的时候还是要按照 ASNI C 的标准。

     

  • 相关阅读:
    HashMap源码分析
    LinkedList源码分析
    ArrayList源码学习
    Java容器知识总结
    Collections 工具类和 Arrays 工具类常见方法
    Java基础知识
    MySQL高级之索引优化分析
    MySQL命令大全
    Java IO
    SpringCloud笔记
  • 原文地址:https://www.cnblogs.com/foreverW/p/7296458.html
Copyright © 2011-2022 走看看