void类型及void指针

void类型及void指针void 类型及 void 指针基于前面的一篇博客模拟实现 memcpy 和 memmove 时用到的 void 指针展开关于 void 和 void 指针的概述 1void 类型 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 1 void 相信大家不会陌生 经常定义无返回值的函数是用 void 定义 表示函数无需返回值 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp voidfun void

void类型及void指针

基于前面的一篇博客模拟实现 memcpy memmove 时用到的void* 指针展开关于 void void* 指针的概述;

1>void 类型

             
1.void 相信大家不会陌生,经常定义无返回值的函数是用 void 定义,表示函数无需返回值;
              
void fun(void) { ; }
           
 2. void 的字面意思是 “无类型”,  void 可以定义变量 ,但是相信应该没人会去这样定义,因为没有任何人意义,


       并且大多数编译器都会报错。例:

void类型及void指针
.        
3.这里还有一个误区,有些时候程序员会没有写出函数的返回值类型,在C语言中,凡是没有加返回值类型限制的


函数都会被编译器作为返回整形值处理,大多数程序员可能会认为是 void 型;


fun(void) { return 0; }


.


       在上面这段代码里,fun函数无参数,一般我们都会直接写个 () 里面什么都不会写,作为一个良好的编程习惯,



       一般函数无参,则默认为void;如果函数的参数可以是任意类型的指针,你那么应该声明为 void*;



       这里既可以引出我们接下来要讲的  void*  指针!


        4.void 真正发挥的作用:

                              (1)对函数返回的限定
                              (2)对函数参数的限定

 2>void*指针

               1. 平时我们所熟知的指针类型都 int*  ,char*,而void*可以指向任何类型的数据,包括’\0′;这就是实现

               memcpy和memmove时使用void*的原因;void*就是“无类型的指针”;

               2.   平时我们将指针 p1 赋值给 指针 p2 时需要判断指针类型是否一致,否则将会出错,如果不一致则需要强

               制类型转换;例:   

.        

int *p1; char *p2; p1 = (int*)p2;

         当然这样的定义指针而不初始化是有问题的,只是为了举例方便,大家自己写的时候要注意野指针的问题;

          而void*则可以随意的接收任何类型的指针,但是其他类型的指针不能随意接收void *的指针,这就是前面说到

的void*是个无类型的的指针,所以它所指向的内容类型是不确定的;

          但是这并不意味其他类型的指针无法接受void * 指针,我们不是还有强制类型转换嘛!



void* fun(void* p,void *q) { char *s1 = (char *)p; int *s2 = (int *)q; }

.           

  “无类型可以包容有类型,而有类型不能包容无类型”,这是引用大牛总结的话,相信我举的例子已经把这句话

诠释了!

             3.关于函数无返回值时定义为void 还需强调一下,其实C语言有很严格的类型检查,不会允许函数不加类型声

明的情况发生的, 但是编译器并不是这么严格!   所以函数无返回值时一定要加void 声明;

            以上是我现在对void 的理解,比较片面,以后会多加补充。

            谢谢!

     
















































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231414.html原文链接:https://javaforall.net

(0)
上一篇 2025年12月14日 下午6:01
下一篇 2025年12月14日 下午6:22


相关推荐

  • Apache和Nginx的区别

    Apache和Nginx的区别

    2021年11月6日
    38
  • 对不起,学会这些 Linux 知识后,我有点飘

    对不起,学会这些 Linux 知识后,我有点飘Linux简介UNIX是一个交互式系统,用于同时处理多进程和多用户同时在线。为什么要说UNIX,那是因为Linux是由UNIX发展而来的,UNIX是由程序员设计,它的主要服务对象也是程序员。Linux继承了UNIX的设计目标。从智能手机到汽车,超级计算机和家用电器,从家用台式机到企业服务器,Linux操作系统无处不在。大多数程序员都喜欢让系统尽量简单,优雅并具有一致性。举个例子,从最底层的角度来讲,一个文件应该只是一个字节集合。为了实现顺序存取、随机存取、按键存取、远程存取只能是

    2022年5月31日
    26
  • lua字符串截取_lua删除数组元素

    lua字符串截取_lua删除数组元素localstr=”helloworld!”string.sub(str,1,string.len(str)-1)–hellowordstring.sub(str,起始位置,整个字符串的长度)–获取指定位置长度的字符串string.len(目标字符串)–获取字符串的长度

    2022年10月6日
    5
  • php 开启opcode,php 开启 opcode 测试

    php 开启opcode,php 开启 opcode 测试php 开启 opcode 测试 合理使用 实验环境系统信息 Linuxlocalho localdomain3 10 0 514 10 2 el7 x86 64 1SMPFriMar30 04 05UTC2017x86 64×86 64×86 64GNU Linux 内存 512MCPU1 核 PHP 版本 PHP7 0 21 amp ZendOPcach

    2025年7月3日
    6
  • 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)「建议收藏」

    解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)「建议收藏」解剖SQLSERVER第十四篇Vardecimals存储格式揭秘(译)http://improve.dk/how-are-vardecimals-stored/在这篇文章,我将深入研究vardecimals是怎麽存储在磁盘上的。作为一般的介绍vardecimals是怎样的,什么时候应该使用,怎样使用,参考这篇文章vardecimal存储格式启用了吗…

    2022年7月20日
    20
  • visifire 控件

    visifire 控件引言Silverlight对于图形图像处理方面,从1.0时代起就给予了很强大的支持,所以我们可以在Silverlight中实现非常棒的各种统计图表,然而现在有了一些开源的项目,使得这项工作更加的简单。本文我将介绍一个开源的项目visifire,使用它可以在Silverlight2中实现超酷的图表。简单图表首先我们需要下载Visifire项目Silverlight开发包,在建立完项…

    2022年7月21日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号