void和void*指针的解析

来源:互联网 发布:java程序员主要做什么 编辑:程序博客网 时间:2024/05/29 03:30

  前段时间看了篇文章讲到了C语言中void的用法细节,但是只是进行了说明并未进行实例分析也没有说明C++中void是否有区别,因此今天我在这里详细说明一下void的一些细节。分析结果皆来自代码分析,并未查阅相关技术文档,如有错误请指正。
  void的定义:void在C和C++是一种数据类型,意为“空指针”。
  void类型在C语言中:无法定义
  void类型变量,无论是cl还是gcc编译器都会对void类型变量的声明报错,因此不存在void类型赋值等方面的问题。但是void指针的定义是有效的,毕竟void*的使用应该很广泛相关代码:

#include <stdio.h>int main(int argc,char* argv[]){    // error: void void_num;    void*p;    //voi的长度地址    printf("void的长度    :%d\n",sizeof(void));       printf("void指针的长度:%d\b",sizeof(p));    printf("void的地址    :%p\n",p);    p ++;    printf("void++的地址  :%p\n",p);    p += 3;    printf("void + 3的地址:%p\n",p);    return 0;}

  在cl编译器下会报错如图:
这里写图片描述
  在gcc编译器下正常运行并且可以看出void的长度是4个字节但并不敢断言void的长度和int长度相同,而且在gcc下可以对void指针进行相关的运算cl下就不行。
这里写图片描述
  同样的代码在C++中运行,结果基本和C语言下相同唯一不同是G++会有警告:

void*的实际应用

  void*有一个特性,任何数据类型的指针可以无错误的转换为void*类型,但是void*类型无法转换为其它类型指针,而且仅限指针之间转换
  下面的代码是错误的:

include <stdio.h>int main(int argc,char* argv[]){    int iNum = 12;    double dNum = 12.00;     void* ip = &iNum;    void* dp = &dNum;    printf("ip:%d\n",*ip);    printf("dp:%d\n",*dp);    return 0;}

  无论是gcc还是cl都会报错:

  c++得到的结果一样
  void指针的使用一般多用于函数中,特别是函数指针大多都定义为void*;
  类似于

  void *  memcpy(_Out_writes_bytes_all_(_Size) void * _Dst, _In_reads_bytes_(_Size) const void * _Src, _In_ size_t _Size);(摘自stdio.h源文件)

  这样可以让函数适用于多种数据类型(C++貌似已经不太需要)
  

当void作为函数参数时

#include <stdio.h>void fun(void){    printf("fun\n");}int main(int argc,char* argv[]){    fun(1);    return 0;   }

  按找上述代码编译会出错但是如果将fun(void)中的void去掉C语言编译将不受影响,但C++仍报错,所以对于一般编程尽量将void加上

总结

1、void无法作为一种数据类型存在2、void*在不同环境下行为不同,cl不可寻址运算,gcc下可以寻址也可以运算3、对于无参数的函数,C语言对接受参数不会做详细的类型检查,尽量加上void4、void*的使用可以使代码更具通用性
0 0
原创粉丝点击