当前位置: 首页 > news >正文

对void的深度理解

作者:小树苗渴望变成参天大树
作者宣言:认真写好每一篇博客
作者gitee:gitee
在这里插入图片描述
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

void

  • 前言
  • 一、 void 关键字
  • 二、 void修饰函数返回值和参数
  • 三、void指针
    • 3.1void * 定义的指针变量可以进行运算操作吗
    • 3.2void * 用来设计通用接口
  • 四、总结


前言

我相信再大家潜意识里对void的理解解释空类型的意思吧,觉得void的作用并不是那么的多,这篇博客让你充分认识到void的含义以及作用


一、 void 关键字

void通俗的来说和其他的数据类型世同级的,但是void关键字的用法非常多,他也有一些做不到的事情。

void是否可以定义变量?

#include <stdio.h>
#include <windows.h>
int main()
{
void a;
system("pause");
return 0;
}

运行结果:
在这里插入图片描述

我们看到void是定义不了变量的,我们知道用数据类型定义变量是为其分配多大的空间,而类型的大小就起到开辟多大空间的作用,那让我们来看看void的大小是多少:

在这里插入图片描述
这下我们知道为什么void定义不了变量了吧,这是再vs2019上看到的结果,那我们再vscode的gcc编译器看看结果:
在这里插入图片描述

我们看到再gcc编译器上的void的大小是1,为什么还是不可以定义变量呢?

void本身就被编译器视为空类型,强制的不允许定义变量

总结:为何 void 不能定义变量?
定义变量的本质:开辟空间
而void作为空类型,理论上是不应该开辟空间的,即使开了空间,也仅仅作为一个占位符看待,所以,既然无法开辟空间,那么也就无法作为正常变量使用,既然无法使用,编译器干脆不让他定义量。

二、 void修饰函数返回值和参数

场景1:void用来作为函数返回值

test()
{;
}
int main()
{int a = test();printf("%d", a);system("pause");return 0;
}

在这里插入图片描述
我们看到函数不用返回值是正确的,并且默认返回的int类型的,不用void会让程序员不知道你是没有返回值还是返回int类型,那void的好处是什么呢??1.占位符,让用户明确不需要返回值。2.告知编译器,返回值无法接收

场景2:void 作为函数参数
我们先来看一个代码:不带参数的函数传参

void test()//默认不要参数
{;
}
int main()
{test(2,5,"niaho");system("pause");return 0;
}

这样的代码并不会出现错误,原因是你传进去,但没有东西接收

void test(void)//明确告诉你不要参数
{;
}
int main()
{test(2,5,"niaho");system("pause");return 0;
}

这样就会报错,明确说不用参数,你传参就会报错

结论:
1.如果一个函数没有参数,将参数列表设置成void,是一个不错的习惯,因为可以将错误明确提前发现
2.另外,阅读你代码的人,也一眼看出,不需要参数。相当于"自解释"

题外话,尽管如此,如果这点你不习惯,也不勉强。

三、void指针

void不能定义变量,那么void*呢?

#include <stdio.h>
#include <windows.h>
int main()
{void* p = NULL; //可以system("pause");return 0;
}

在这里插入图片描述

我们看到可以通过并且没有报警,为什么void可以呢?因为void是指针,是指针,空间大小就能明确出来

我们再来看看void*有那些特性:

#include <stdio.h>
#include <windows.h>
int main()
{
void *p = NULL;
int *x = NULL;
double *y = NULL;
p = x; //虽然类型不同,但是编译器并不报错
p = y; //同上
x=p;
y=p
system("pause");
return 0;
}

在这里插入图片描述

我们看到编译器叶没有报错,我们可以得出如下结论:
1.void的作用是用来接受任意指针类型的。
2.任意指针也可以接受void
类型的。

这块在后面如果想设计出通用接口,很有用,例如:

/void * memset ( void * ptr, int value, size_t num );

3.1void * 定义的指针变量可以进行运算操作吗

我们上面介绍了void可以定义指针变量,我们知道指针变量是可以进行运算操作的,那void*的指针可以进行运算操作吗?我们一起来看看:

(NULL实际就是在0进行强转变成void*类型)

#include <stdio.h>
#include <windows.h>
int main()
{
void *p = NULL;
p++; //报错
p += 1; //报错
system("pause");
return 0;
}

在这里插入图片描述
我们之前在指针那一节说过,指针运算的大小和类型有关,例如int的类型,加1就跳过一个整型,那么void在vs2019上不知道大小的,自然加1是不知道的,所以会报错。

那让我们来看一下gcc编译器上的结果吧
在这里插入图片描述
我们看到gcc编译器上可以通过,原因是在gcc编译器的void大小为1,又了固定的大小

3.2void * 用来设计通用接口

对于一个函数我们需要接受的类型可能不一样,这时候就需要用void*作为接口来实现,这里我不在具体介绍那些是需要接口的例子,大家可以看我之前谢的关于有接口的例子:
qsort
内存操作函数

四、总结

通过这篇博客,我希望大家对void的类型的含义和用法又有了更深的理解,这篇的难度不大,只是为了拓展我们的知识面,希望能够版主到大家,今天我们就说到这里,我们下篇再见
在这里插入图片描述

相关文章:

对void的深度理解

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; void前言一、 void 关键字二、 void修饰函数返回值和参数三、void指针3.1void * 定义的…...

哪款游戏蓝牙耳机好用?好用的游戏蓝牙耳机推荐

现在&#xff0c;不少人喜欢戴蓝牙耳机玩游戏&#xff0c;而在戴蓝牙耳机玩游戏时难免会产生音画不同步的问题。现在越来越多的蓝牙耳机支持游戏模式&#xff0c;那么&#xff0c;哪款游戏蓝牙耳机好用&#xff1f;接下来&#xff0c;我来给大家推荐几款好用的游戏蓝牙耳机&…...

求职(怎么才算精通JAVA开发)

在找工作的的时候,有时候我们需要对自己的技术水平做一个评估。特别是Java工程师,我们该怎么去表达自己的能力和正确认识自己所处的技术水平呢。技术一般的人,一般都不敢说自己精通JAVA,因为你说了精通JAVA几乎就给了面试官一个可以随便往死里问的理由了。很多不自信的一般…...

C++网络编程(三)IO复用

C网络编程(三)IO复用 前言 多进程/多线程网络服务端在创建进程/线程时&#xff0c;CPU和内存开销很大。因为多线程/进程并发模型&#xff0c;为每个socket分配一个线程/进程。而IO复用采用单个的进程/线程就可以管理多个socket。 select 系统调用原型&#xff1a; #includ…...

第十四届蓝桥杯(第三期)模拟赛试题与题解 C++

第十四届蓝桥杯&#xff08;第三期&#xff09;模拟赛试题与题解 C 试题 A 【问题描述】 请找到一个大于 2022 的最小数&#xff0c;这个数转换成十六进制之后&#xff0c;所有的数位&#xff08;不含前导 0&#xff09;都为字母&#xff08;A 到 F&#xff09;。  请将这个…...

【Hive 基础】-- 数据倾斜

1.什么是数据倾斜&#xff1f;由于数据分布不均匀&#xff0c;导致大量数据集中到一点&#xff0c;造成数据热点。常见现象&#xff1a;一个 hive sql 有100个 map/reducer task&#xff0c; 有一个运行了 20分钟&#xff0c;其他99个 task 只运行了 1分钟。2.产生数据倾斜的原…...

计算机网络笔记——物理层

计算机网络笔记——物理层2. 物理层2.1 通信基础2.1.1 信号2.1.2 信源、信道及信宿2.1.3 速率、波特及码元2.1.4 带宽2.1.5 奈奎斯特定理采样定理奈奎斯特定理2.1.6 香农定理2.1.7 编码与调制调制数字信号调制为模拟信号模拟数据调制为模拟信号编码数字数据编码为数字信号模拟数…...

算法第十七期——状态规划(DP)之动态压缩

一、总述 状态压缩动态规划&#xff0c;就是我们俗称的状压DP&#xff0c;是利用计算机二进制的性质来描述状态的一种DP方式。 应用背景&#xff1a;以集合为状态&#xff0c;且集合可以用二进制来表示&#xff0c;用二进制的位运算来处理。集合问题一般是指数复杂度的&#x…...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A模块第八套解析(详细)

2022年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (8) (总分100分) 赛题说明 一、竞赛项目简介 “网络安全”竞赛共分A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四个模块。根据比赛实际情况,竞…...

【华为OD机试真题 JAVA】数组中是否存在满足规则的数字组合

标题:数组中是否存在满足规则的数字组合 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 给定一个正整数数组,检查数组中是否存在满足规则的数字组合 * 规则: * A = B + 2C 输入描述: * 第一行输出数组的元素个数。 * 接下来一行输出所有数组元素,用空格…...

【OpenCV技能树】——OpenCV基础

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; 目前正在进行 OpenCV技能树的学习&#xff0c;OpenCV是学习图像处理理论知识比较好的一个途径&#xff0c;至少比看书本来得实在。本专栏文章主要记录学习Op…...

人体姿态识别

自留记录论文阅读,希望能了解我方向的邻域前沿吧 粗读,持续更新 第一篇 ATTEND TO WHO YOU ARE: SUPERVISING SELF-ATTENTION FOR KEYPOINT DETECTION AND INSTANCE-AWARE ASSOCIATION 翻译:https://editor.csdn.net/md?not_checkout=1&spm=1001.2014.3001.5352&…...

ubuntu下调试驱动

使用 Ubuntu Linux 测试 Linux 驱动 1. 测试 Linux 驱动准备工作 ​ 对于一个 Linux 驱动程序&#xff0c;一开始可以在 Ubuntu Linux 上做前期开发和测试。对于访问硬件部分也可以在 Ubuntu Linux 用软件进行模拟,切记不能代替真实的环境&#xff01;当基本开发完成后&#…...

第十四届蓝桥杯三月真题刷题训练——第 9 天

第 1 题&#xff1a;找素数 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 素数就是不能再进行等分的整数。比如&#xff1a;7&#xff0c;11。而 9 不是素数&#xff0c;因为它可以平分为 3 等份。一般认为最小的…...

操作系统复习

熟练掌握操作系统的定义&#xff0c;操作系统的特征&#xff0c;操作系统的功能熟练掌握多道程序设计的概念&#xff0c;单道程序设计和多道程序设计的区别&#xff0c;多道程序设计的优点熟悉操作系统接口的主要功能&#xff0c;系统调用的基本概念、类型、实现。操作系统接口…...

springboot健身房管理系统

springboot健身房管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xf…...

C语言学习笔记——数组

前言 数组是C语言中的一种自定义数据类型&#xff0c;它的使用非常广泛。但是很多新手在使用数组时&#xff0c;经常在一些细节上出问题&#xff0c;导致程序崩溃或者无法编译。今天&#xff0c;我就来详细聊聊数组的使用和我注意到的一些细节。 一、常见的数组类型与数组的创建…...

类和对象 - 中

本文已收录至《C语言》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言 正文 构造函数 对比C和C的初始化 构造函数的使用与特性 默认构造函数 C11关于默认构造缺陷的补丁 析构函数 析构函数特性 默认析构和自定义析构 拷贝构造函数 问题聚焦 拷贝构造的定…...

Android之屏幕适配方案

在说明适配方案之前&#xff0c;我们需要对如下几个概念有所了解&#xff1a;屏幕尺寸&#xff0c;屏幕分辨率&#xff0c;屏幕像素密度。 屏幕尺寸 屏幕尺寸指屏幕的对角线的物理长度&#xff0c;单位是英寸&#xff0c;1英寸2.54厘米。 比如常见的屏幕尺寸&#xff1a;5.0、5…...

SpringBoot+jersey跨域文件上传

一、配置tomcat服务器 1.1、添加upload文件夹 在webapps\Root文件夹下创建用于接收上传文件的upload文件夹 1.2、修改conf\web.xml设置允许上传文件 <init-param><param-name>readonly</param-name><param-value>false</param-value></ini…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...