C语言中的void

news2024/11/18 15:26:55

文章目录

    • 一.void概要
    • 二.void应用场景
      • 2.1void能定义变量吗?
      • 2.2void这个类型有大小吗?
      • 2.3void*能定义变量吗?
      • 2.4void*使用
      • 2.5void*能不能进行对应的指针运算?
      • 2.6void和函数返回值
      • 2.7函数void类型的参数

一.void概要

void就是空的意思,一般用于函数参数,函数返回值,指针初始化的一些场景中。

二.void应用场景

2.1void能定义变量吗?

既然void也是一个类型可以像int类型这样定义吗?

int a = 10;

void b = 1;//????

通过编译器来试一试:
在这里插入图片描述

答案是当然不行的。

2.2void这个类型有大小吗?

我们知道int是4四个字节,char是一个字节,那void是几个字节,或者是它到底有没有大小?

printf("%d", sizeof(void));

在这里插入图片描述

可以发现void在VS这个编译器下的大小是0,就是没有大小。
但是所有平台上的void都是没有大小的吗?接下来我在Linux平台上再做个演示:
在这里插入图片描述

其它的不知道不要紧,只记住在Linux平台上void大小是1就行

通过上面例子,这也能解释了一个问题:void为什么不能定义。

首先要知道定义变量的本质是什么:在内存中开辟一块固定大小的空间。
因为void为空类型,也就是大小为0,理论上是不能开辟空间的,即使在Linux中占1个字节,那也仅仅是作为一个占位符来看待
既然无法开辟空间,也就无法作为正常变量使用。既然无法使用,所以编译器干脆就不让他定义变量了,即使在Linux平台上也不行。

2.3void*能定义变量吗?

既然void不能定义变量,但是void*可以吗,它可以定义一个指针类型吗?

int main()
{
	void* p = NULL;
	return 0;
}

在这里插入图片描述

发现是没有任何错误的?为什么呢?void不能定义变量是因为它没有大小,不能开辟空间,而void*就不同了,它是一个指针类型,指针类型的大小是固定的:32位平台是4字节/64位平台是8字节。就是因为它有空间,所以不会报错。

2.4void*使用

void*还有什么神奇的功能呢?先看下面这个代码:

int main()
{
	int a = 10;
	double b = 3.14;
	int* pa = &a;
	double* pb = &b;

	pa = pb;
}

两个不同类型的指针能相互赋值吗?
在这里插入图片描述

答案是不行,虽然能成功运行,但是会有警告。

但是下面这样写可以吗?

int main()
{
	int a = 10;
	int* pa = &a;
	void* pb = NULL;

	pa = pb;
}

在这里插入图片描述

现在可以发现没有任何错误和警告,这就说明了一件事:

void*类型可以被任意一个类型接收。

现在反过来写看看可以吗?

int main()
{
	int a = 10;
	int* pa = &a;
	void* pb = NULL;

	pb = pa;
}

在这里插入图片描述

发现也是无错误,无警告。所以说:

void*类型可以接收任意类型。

上面void*的这些特性是很常见的,比如向memset,memcpy这些函数接口:
在这里插入图片描述
在这里插入图片描述

这些函数中都有用到,这样的话你再调用这些参数时,不管传进去的参数是什么类型的,它都能接收和使用。

2.5void*能不能进行对应的指针运算?

先看这段代码:

int* a = NULL;
a++;
a--;

这里的指针运算是什么意思呢?指针对应的±,其实就是指针向后/向前走的步长int*类型的指针++,说明指针向后移动4个字节。

通过上面的补充说明,我想大家都能猜到答案了,因为void本身是没有大小的,对它进行相应的运算是毫无意义的,因此C语言直接将这种写法当成错误了。
在这里插入图片描述

刚才我说的是在VS下运行的结果,肯定有人会想在Linux上void的大小是1呀,难道在那里也不能运行吗?直接看结果:
在这里插入图片描述

指令写到这里是没有任何报错的,说明其实在Linux下运行是没有问题的(这里的代码和在VS里一样,所以这里没有任何输出,看不到反馈)。

2.6void和函数返回值

void test()
{
	printf("hello\n");
}

int main()
{
	test();
	return 0;
}

如果一个函数的返回类型是void,就表明这个函数是没有任何返回值的。

现在我把void去掉可以吗?

test()
{
	printf("hello\n");
}

int main()
{
	test();
	return 0;
}

在这里插入图片描述

发现是可以的,但是我现在强行让函数返回一个值可以吗:

test()
{
	printf("hello\n");
	return 1;
}

int main()
{
	test();
	return 0;
}

在这里插入图片描述

发现仍然可以。现在再来改一下,既然你有返回值,我下面接收一下会报错吗?

test()
{
	printf("hello\n");
	return 1;
}

int main()
{
	printf("%d\n", test());
	return 0;
}

在这里插入图片描述

发现仍然能正常接收,而且我试过返回int,char这些类型都可以,返回什么就能接收到什么。但是没有写返回类型时,其默认是返回int类型。

现在我们把函数的返回值设置成void看看可不可以:

void test()
{
	printf("hello\n");
	return 1;
}

int main()
{
	printf("%d\n", test());
	return 0;
}

在这里插入图片描述

发现这里会直接报错,所以我们知道了:

void修饰返回值时,起到一个占位符的作用,意思是明确告诉你这个函数是没有返回值的,你函数里面硬是要写也可以,但是调用时绝不能接收,只要接收就会报错。

2.7函数void类型的参数

看下面这一组代码:

void test1()
{
	printf("hello\n");
}

void test2(void)
{
	printf("word\n");
}

int main()
{
	test1(1, 2, 3, 4);
	//test2(1, 2, 3, 4);
}

虽然函数里的参数都是没有的,我硬是要传过去几个参数会有什么后果呢?
先看调用第一个的结果:
在这里插入图片描述

发现没有任何错误,继续看调用第二个:
在这里插入图片描述

这里就会出现一个警告,但实际上运行还是能运行的。在我这个编译器上是一个警告,但是其它平台上可能直接就是一个错误了,接下来看看Linux平台上是警告还是错误:
在这里插入图片描述

发现在这里就会直接报错。通过这些例子,我们知道了:

void充当函数的形参列表,是为了告知编译器或你这个人,这个函数是不能传任何参数的。如果你函数没有任何参数里面可以加上void,这是一个挺不错的编程习惯。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多种方法帮你解决tomcat项目部署,idea控制台乱码问题

解决在使用Tomcat过程中idea控制台出现的乱码问题 以下将介绍几种方法(都是小编亲测实用的方法),尝试并寻找适合自己的方法即可 由于我已经处理过了乱码问题,我就重新配置一下 (我有效解决的方案是把-Dfile.encoding…

SQL开窗函数之前后函数(LEAD、LAG)

开窗函数 当我们需要进行一些比较复杂的子查询时,聚合函数就会非常的麻烦,因此可以使用开窗函数进行分组再运用函数查询。窗口函数既可以显示聚集前的数据,也可以显示聚集后的数据,可以在同一行中返回基础行的列值和聚合后的结果…

cubeIDE开发, 全面解析cubeMX图形配置工具

一、cubeIDE 集成cubeMX STM32CubeMX是st公司早期产品,现已经成为STM32Cube开发套件的一部分,直接集成到cubeIDE 开发平台省,是一种芯片引脚图形配置工具,可以非常轻松地配置STM32微控制器和微处理器,以及为Arm Cortex…

java+MySQL基于ssm的公文流转关管理系统

在企业的日常管理过程中,公文管理是日常管理中必不可少的组成部分,其管理水平的高低体现了一个企业管理水平的整体状况。一直以来企业使用传统人工的方式管理公文数据,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,为操作人员带来不少…

python_selenium自动化测试框架

设计思路 本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享。 框架采用python3 selenium3 PO yaml ddt unittest等技术编写成基础测试框架,能适应日常测试工作需要。 1、使用Page Object模式将页面定位和业务操作分开&#xff0…

cdp4j爬虫自动化学习

cdp4j爬虫自动化学习cdp4j介绍依赖通过识别本地文件进行调试cdp4j介绍 cdp4j是一个Java库,它提供了高级API来通过DevTools协议控制Chrome或Chromium。它可以用于自动使用网页和测试网页。cdp4j默认情况下可以完全运行,但可以配置为运行无头Chrome或Chro…

Spring Cloud Eureka 服务注册中心怎么配置

Eureka,这里是 Spring Cloud Eureka 的简称,是 Spring Cloud Netflix 组件之一。Spring Cloud Netflix 中核心的组件包括了服务治理(Eureka),服务容断(Hystrix),路由(Zuu…

hypermesh和lsdyna联合仿真计算某汽车座椅进行的头冲吸能实验

导读:本案例运用hypermesh和lsdyna联合仿真,主要是针对某座椅进行的头冲吸能实验的仿真计算。这个工况考察座椅背部的塑料件的破坏情况,以及头部模块的加速度情况,达到保护人头部的效果。 本案例用户可以学习到: 1…

大学生程序设计创新实践基地2022年冬季校赛(NPU ACM Winter Contest)

大学生程序设计创新实践基地2022年冬季校赛(NPU ACM Winter Contest) 总述 总体考察对于板子的熟练变换,以及考察离谱地使用python和对getchar()以及EOF的基础掌握程度。 B,D,E是防AK题目。 题解 A死锁 ​ input…

【第九章 SQL优化_插入数据,主键优化,order by优化】

第九章 SQL优化_插入数据,主键优化,order by优化 1.插入数据: (1)insert: (1)批量插入数据: Insert into tb_test values(1,Tom),(2,Cat),(3,Jerry); (2&am…

PyTorch(五)神经网络基础

文章目录Log一、Containers 基本骨架1. Module2. Sequential二、 Convolution Layers 卷积层1. torch.nn.functional① Conv2d2. torch.nn① Conv2d三、Pooling layers 池化层1. nn.MaxPool2d 下采样(最大池化)四、Non-linear Activations 非线性激活1. …

2022CCSP T1最少充电次数

记录第一次CCSP竞赛。一共3题,只做出第一题,用时3h30m(累),ac了开心地吃了个午饭。然而饭饱之后,大脑完全提不起神看着题面昏昏欲睡。第二题是虚拟内存,超级大模拟,刚好这个学期学os…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java流浪动物救助网站a1wsz

毕业设计也不需要做多高端的程序,毕业设计对于大多数同学来说,为什么感觉到难,最重要的一个原因,那就是理论课到实践课的转变,很多人一下不适应,本能开始拒绝,如果是一个考试,大家都…

ITU、MCC和MNC介绍以及China运营商对照表

相关概念 ITU 国际电信联盟是联合国负责信息通信技术(ICT)事务的专门机构。 国际电联成立于1865年,为了促进国际上通信网络的互联互通。他们进行全球无线电频谱和卫星轨道的划分,制定技术标准以确保实现网络和技术的无缝互连&…

【Docker】30条Docker常用命令图文举例总结

本期目录1. 帮助启动类命令2. 镜像命令2.1 列出镜像2.2 搜索远程库镜像2.3 拉取镜像2.4 查看所占空间2.5 删除镜像2.6 面试题3. 容器命令3.1 新建启动容器1)启动交互式容器3.2 列出当前所有正在运行的容器3.3 退出容器3.4 启动已停止的容器3.5 重启容器3.6 停止容器…

第六章 映射:Mappings

文章目录1、Mapping 简介1.1 mapping 是啥?1.2 如何查看索引映射2、自动映射:dynamic mapping2.1 自动类型推断规则2.2 mapping 的使用禁忌2.3 自动映射器的意义是什么?3、手动映射:Explicit mapping3.1 创建索引的 mapping3.2 修…

电子产品量产工具项目开发中遇到的问题(更新......)

1、找不到tslib.h库的头文件 这是因为找不到tslib库的头文件。 确定工具链中头文件、库文件目录,对于 IMX6ULL ,命令如下 echo main(){}| arm-linux-gnueabihf-gcc -E -v -找到了编译器arm-linux-gnueabihf的include和lib文件夹 /usr/local/arm/gcc-l…

AT155 高压绝缘电阻测试仪 都有哪些功能?

、 高压绝缘电阻测试仪是—款手持式仪表主要用来测量交流/直流电压、 电阻、 短路蜂鸣测试和 绝缘电阻测量。 式高压绝缘电阻测试仪具有4个量程用千绝缘电阻、 AC/DC电压、 电阻和短路蜂鸣测试。 设计达到以下安全标准 .绝缘测试量程O.lMn to 60Gn。…

机器学习 决策树基础 ID3、C4.5、CART

文章目录参考决策树指标基尼系数基础公式公式理解引入划分后的公式划分后公式的理解信息熵、信息增益如何理解信息熵两种指标的对比划分策略ID3定义举例计算各属性的信息增益选取最优属性作划分对子节点作递归划分生成结果ID3的缺点C4.5信息增益率优化缺点CARTCART相较于前两者…

Windows下使用C语言创建定时器并周期和网络调试助手通信

在Windows C下采用timeSetEvent函数来设置定时器 关于timeSetEvent的函数原型及注释如下所示: MMRESULT timeSetEvent(UINT uDelay, // 定时事件的触发周期,单位为毫秒UINT uResolution, // 定时事件的精度,单位…