zoukankan      html  css  js  c++  java
  • C/C++中的 void 和 void*

    转自:https://blog.csdn.net/tonglin12138/article/details/86516789

    写在前面:
    开门见山,大家看下面这个例子:

    unsigned char err;

    unsigned char f;

    unsigned char a(unsigned char i, void *j){

    if(j==(void*)0) return 0;

    *(unsigned char*)j=1;

    return 1;


    void * 就是无类型指针类型,j仅仅是一个指针,他所指向的内存空间没有被认为是某一种特定的类型。

    j 被定义成void *,(void *)0 把0强制转换为 void *,便于跟j进行同类型比较, 所以 j==(void *)0的意思是,判断j是不是0,即j是否指向0地址

    *(unsigned char *) j,首先看(unsigned char *) j,意思是把j强制类型转换为unsigned char 型,那么(unsigned char )j就是把 j 指向的内存空间的一个字节强制当作unsigned char来用。(unsigned char *) j =1就是把1写入j指向的那个一字节空间。

    C/C++中的void和void*
    一、void

    void关键字表示“空类型”的概念。但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西.

    void表示“不存在”的意思,可以从void的两个应用中加以体现:
    1、void作为函数的返回值类型时,表示函数返回值不存在,即函数没有返回值。
    例如:

    void FunctionNoReturn_0(std::string strName)
    {
    std::cout << strName << std::endl;
    return;
    }
    void FunctionNoReturn_1(std::string strName)
    {
    std::cout << strName << std::endl;
    }
    FunctionNoReturn_1函数体中虽然没有显式的Return;语句。但是,有隐式的Return;表示函数不存在返回值。
    FunctionNoReturnType(void)
    {
    return 10;
    }
     
    在C语言中,凡是不加返回值类型限定的函数,就会被编译器作为返回整型值处理,而不是没有返回值。所以,FunctionNoReturnType函数返回10是正确的。
    在C++中,每个函数必须限定返回值类型,不允许不加返回值限定。所以,C++编译器会对FunctionNoReturnType报错。

    2、void作为函数的参数的限定时,表示函数形参不存在,即函数没有形参。
    例如:

    void FunctionNoArgument_0(void)
    {
    return;
    }
    void FunctionNoArgument_1()
    {
    return;
    }
     
    注意:void FunctionNoArgument_1();这也表示没有形参。
    在C语言中,FunctionNoArgument_1(10);是合法的。编译器不会报错。
    在C语言中,FunctionNoArgument_0(10);是不合法的。编译器会报错。
    在C++语言中,FunctionNoArgument_1(10);和FunctionNoArgument_0(10);
    都是不合法的。编译器会报错。
    C语言中不报错,也没什么关系的。因为,参数10对于函数的执行的结果没有影响。但是,对于代码的维护可能会造成隐藏的危害,可能会给别人造成误解。

    说明:既然提供了void的这两种用法,就去运用。即函数没返回值就将其返回值类型写为void,函数没有形参就将其形参写为void。不了解编译器默认操作时,不要依赖。即使了解其默认操作,也别依赖,因为肯定有人不了解的,这样别人就看不懂你的代码了。

    二、void*

    void表示“空类型指针”,与void不同,void表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”。(为什么不用void表示任意类型的数据呢?大家都知道,C/C++是静态类型的语言,定义变量就会分配内存,然而,不同类型的变量所占内存不同,如果定义一个任意类型的变量,如何为其分配内存呢?所以,C、C++中没有任意类型的变量。但是,所有指针类型的变量,无论是int*、char*、string*、Student*等等,他们的内存空间都是相同的,所以可以定义“任意类型的指针”)。

    C++/ANSI C:
    void指针只支持几种有限的操作:与另一个指针进行比较;向函数传递void指针或从函数返回void指针;给另一个void指针赋值。不允许使用void指针操作它所指向的对象,例如,不允许对void指针进行解引用。不允许对void指针进行算术操作。
    GNU C:
    GNU C指定void指针的算术操作与char一致。

    void*表示“任意类型的指针”,主要运用于内存操作函数的形参类型和返回值类型(内存操作与内存中数据类型无关,即任意类型都可以)。

    memcpy  
    原型:extern void *memcpy(void *dest, void *src, unsigned int count);   
    用法:#include   
    功能:由src所指内存区域复制count个字节到dest所指内存区域。   
    说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。   
    注意:与strcpy相比,memcpy并不是遇到’’就结束,而是一定会拷贝完n个字节。

    memset
    原型:extern void *memset(void *buffer, int c, int count);
    用法:#include
    功能:把buffer所指内存区域的前count个字节设置成字符c。
    说明:返回指向buffer的指针。

    C/C++的void*差别
    C语言中任何类型的指针都可以(隐式地)转换为void*型,反过来也行;

    C++中void型不能隐式地转换为别的类型指针(例如:intp = (void*)0;使用C++编译器编译会报错)

    文章参考来源:https://blog.csdn.net/u012611644/article/details/79561022
     

  • 相关阅读:
    Ubuntu 18.04 上使用xrdp远程桌面登录蓝屏解决
    给定几个字母,输出所有可能的组合(使用递归解决)
    docker容器启动参数
    群辉6.1.7安装scrapy框架执行爬虫
    python爬虫在解析不带引号的json报错的问题解决方案
    python的datetime常用方法
    Ubutntu安装docker启动报Removed /etc/systemd/system/docker.service.
    Django admin argument to reversed() must be a sequence
    linux(乌班图)下执行pip没有问题,执行sudo pip报错的问题
    Robot Framework 关键字操作实例
  • 原文地址:https://www.cnblogs.com/do-your-best/p/10977643.html
Copyright © 2011-2022 走看看