C语言中的void

article/2025/10/12 22:33:49

文章目录

    • 一.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://chatgpt.dhexx.cn/article/1vYNr24X.shtml

相关文章

C语言 --- void的用法解析

文章目录 一、简介二、用法三、总结 一、简介 ​ void 中文翻译为"无类型",有的也叫"空类型"。常用在程序中对定义函数的参数类型、返回值、函数中指针类型进行声明。 二、用法 首先应该注意一点的是void类型是不同于其他常见类型的&#xf…

Python爬虫实现英汉互译

用requests模块实现英汉词汇简单互译 1.找到地址: 2.完成代码: import jsonimport requestsurl "https://fanyi.baidu.com/sug" headers {"User-Agent": Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit…

Python 爬虫笔记

Python 爬虫笔记 HTTP协议requests模块get() 和post()函数headers 数据解析正则表达式bs4解析-HTML语法Xpath 批量爬取百度图片selenium 毕设与图像分类相关,所以需要大量的图片数据,所以先学学爬虫爬图片。 本文作为自学笔记,仅供参考 声明&…

爬虫入门练习

目录 网络爬虫一、爬取[南阳理工OJ题目](http://www.51mxd.cn/problemset.php-page1.htm)python代码结果 二、爬取[重交新闻](http://news.cqjtu.edu.cn/xxtz.htm)python代码结果 小结 网络爬虫 简介 网络爬虫英文名叫Web Crawler戒WebSpider。是一种自动浏览网页并采集所需要…

python爬虫网络中断_python爬虫中断

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 当redis的队列为空时,爬虫会重新爬取; 当队列不为空时,爬虫便会接着上次…

爬虫知识综合

1. Scrapy怎么设置深度爬取? 通过在settings.py中设置DEPTH_LIMIT的值可以限制爬取深度,这个深度是与start_urls中定义url的相对值。也就是相对url的深度。若定义url为http://www.domz.com/game/,DEPTH_LIMIT1那么限制爬取的只能是此url下一级的网页。深度大于设…

爬虫之异步爬虫asyncio

与异步爬虫的相见 文章目录 一、asynico是什么?二、使用步骤 1.普通用法2,在爬虫里面的用法 一、asynico是什么? 简言之,就是用这个库可以来实现异步IO 二、使用步骤 1,普通用法 1,下面我们来看一个案例&#xff1…

网络爬虫之规则

网络爬虫之规则 一.Requests库的get()方法1.1requests库的安装1.2 测试requests库的效果1.3 requests库的7个主要方法1.4 requests中的get方法1.5 Response对象的属性(牢记)1.6 理解Response的编码1.7 对以上知识的讲解运用 二.爬取网页的通用代码框架2.…

网络爬虫入门学习

文章目录 一、初识网络爬虫1.1 网络爬虫定义1.2 爬虫原理1.3 爬虫工作的过程 二、示例一2.1 需要的内置库以及第三方库2.2 具体代码2.3 结果展示: 三、示例二3.1 确定要爬取信息的位置3.2 具体代码3.3 结果展示 四、总结五、参考文献 一、初识网络爬虫 1.1 网络爬虫…

爬虫-Python编程入门

文章目录 一.爬虫1.初识网络爬虫2.网络爬虫的分类2.1 通用网络爬虫2.2 增量爬虫2.3 垂直爬虫2.4 Deep Web爬虫 3.Robots协议 二.创建anaconda虚拟环境三.爬取网站 http://www.51mxd.cn/练习题目数据并保存四.爬取网站http://news.cqjtu.edu.cn/xxtz.html中近几年的消息通知的发…

python爬虫提取人名_python爬虫—爬取英文名以及正则表达式的介绍

python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一. 爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个csv文件中;再读取csv文件当中的每个英文名链接,采用循环的方法读取每一个英文名…

python爬虫什么意思-python的爬虫是什么意思

Python爬虫即使用Python程序开发的网络爬虫(网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。其实通俗的讲就是通过程序去获取 web 页面上自己想要的数据,也就是自动抓取数…

python爬虫英文单词_Python_爬虫百度英文学习词典

主方法main 定义主函数main,程序的入口,首先导入io包,用os.path.exists判断字典文件是否存在,如果不存在则新建一个,然后进入循环中,让用户输入相应的数字,执行相应的功能。 def main(): fla…

爬虫基础知识

一、Scrapy 1、cookie设置 目前cookie的设置不支持在headers进行设置, 需要通过以下三种方式进行设置: 第一种:setting文件中设置cookie 当COOKIES_ENABLED是注释的时候,scrapy默认没有开启cookie。当COOKIES_ENABLED没有注释设置为False的…

爬虫介绍

这里写目录标题 1 爬虫介绍1.1 什么是爬虫1.2 爬虫的作用1.3 业界情况1.4 合法性1.5 反爬1.6 爬虫的本质1.7 爬虫的基本流程1.8 爬虫的基本手段1.9 为什么是python 1 爬虫介绍 1.1 什么是爬虫 爬虫更官方点的名字叫数据采集,英文一般称作spider 网络爬虫也叫网络蜘…

pythonrequests爬虫外文文献_Python爬虫(一):爬虫介绍、Requests库介绍及实例-Go语言中文社区...

本文主要内容: 1.爬虫的相关概念。 2.Requsets库安装。 3.Requests库介绍。 4.爬取网页的通用代码框架。 1.爬虫相关概念。 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照…

Python网络爬虫(一)---urllib

什么是网络爬虫 网络爬虫英文可以叫crawler,也可以叫spider,简而言之就是利用计算机从网上抓取你所感兴趣的文件、图片、视频等。其实在大多数情况下,没有什么网络爬虫,我们也可以根据自己所需要的,通过浏览器从网上下…

python爬虫爬取英文考研词汇

这几天开始背诵考研单词,在网上查找英语考研必备词汇,发现都是长这样的: 每一页的点击太费时费力了。因此萌生了为什么不能用爬虫把单词爬下来保存在本地呢?说干咱就干。首先点开搜索中的某个网页,分析网页的结构,找到其中的规律。例如,我找的是跨考考研的网站: 这是…

python爬虫: 爬一个英语学习网站

爬虫的基本概念 关于爬虫的基本概念, 推荐博客https://xlzd.me/ 里面关于爬虫的介绍非常通俗易懂. 简单地说,在我们输入网址后到可以浏览网页,中间浏览器做了很多工作, 这里面涉及到两个概念: IP地址: IP地址是你在网络上的地址,大部分情况下…

可视化数据分析-基于JavaScript的d3实践学习

目录 一.svg简介 二.D3简介 D3功能来源 常用语法说明 三.d3可视化访问MySQL数据库 实现方法 四.具体用例实现 svg绘制直方图 svg绘制二叉树(以电影票房为例) D3进行数据可视化(链接数据库) D3绘制直方图​ D3绘制饼图…