【C语言】void 和 void* 类型

article/2025/10/12 21:41:21

一. void 类型

1. 为何不能定义 void 类型的变量

为什么不能定义 void 类型的变量?因为它是空类型,不能够为变量提供空间吗?

定义变量的本质是开辟空间,我们用 sizeof 来计算 void 类型的大小:

  • 在vs2017下,不支持计算 sizeof(void)
  • 在Linux中,sizeof(void)=1

可以看到不同平台下 void 类型的大小是不确定的,在 Linux 平台下 void 类型的大小是一个字节,既然为操作系统其开辟了空间,为什么又不能让它定义变量呢?

考虑 void 作为空类型,理论上是不应该开辟空间的,即使开了空间,也仅仅作为一个占位符看待。所以,既然无法开辟有效存储数据的空间,那么它定义的变量也就无法作为正常变量使用,既然无法使用,编译器干脆强制不让它定义变量。

2. void 作为函数的返回值

void作为函数返回值类型有两个作用:

  1. 占位符,明确告知程序员这个函数不需要返回值
  2. 告知编译器,这个函数的返回值无法接受

在这里插入图片描述

二. void* 类型

1. 能否定义 void* 类型的指针?

任何平台、任何编译器,都是可以定义 void* 类型的指针变量的。

使用 sizeof 计算 void* 的大小:
在这里插入图片描述

可以发现 void* 的大小和其他类型指针变量的大小一样,都是4个字节。

2. 2. void* 类型指针的使用场景

  • void* 类型的地址可以被其他任何类型的指针变量接收(需要强制类型转)
  • void* 类型的指针变量也可以接收其他任意类型指针变量的值
int main()
{void* p = NULL;int* x = NULL;double* y = NULL;// 两种情况都可以编译通过// 不会报错误和警告x = (int*)p;y = (double*)p;p = x;p = y;return 0;
}

通常在库和系统接口的设计上,会尽量把参数和返回值设计成通用接口:

在这里插入图片描述

3. void* 类型的指针变量能否进行位运算?

看下面一段代码:

int main()
{int a = 10;void* p = &a;printf("%p\n", p);++p;printf("%p\n", p);return 0;
}

同一段代码对比两个平台的执行结果:

  • vs2017:编译不通过,报错"void*":未知的大小
  • Linux:编译通过,结果输出:0x7fff4bf2f634 0x7fff4bf2f635,结合前面在Linux中计算 sizeof(void) = 1,所以 void* 类型的指针变量的值自增1,会是的地址的值加1。

造成如上结果的原因:两个平台支持的标准有差异

GNU计划,又称革奴计划,是由Richard stallman(理查德·斯托曼)在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。它在编写1inux的时候自己制作了一个标准成为GNU c标准。ANSI美国国家标准协会,它对c做的标准ANSI c标准后来被国际标准协会接收成为标准c所以ANSI C和标准c是一个概念,总体来说现在1inux也支持标准c,以后标准c可以跨平台,而GUN c一般只在linux c下应用。–来自百度
Linux 上可用的c编译器是GNU c编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。GNUC对标准C进行一系列扩展,以增强标准C的功能。–来自百度

一句话,大部分编译器是标准C,而Linux下是扩展C,Linux平台也能保证标准c的运行。

4. void* 类型的指针变量可以直接解引用吗?

结果测试不论是在 vs2017 下,还是在 Linux 下都不行。


http://chatgpt.dhexx.cn/article/sdUFS0hB.shtml

相关文章

函数类型——void(无类型函数)

void属于函数类型中的无类型函数之对应的还有实型(float,double),整型(int),布尔型(bool)和字符型(char)。 在介绍void之前先介绍“返回值”: 就…

C语言中的void*是什么?

目录 1.void *是什么2.void*的解引用3.void*类型的应用场景 1.void *是什么 我们之前学过许多类型的指针变量,如整形指针,字符指针,甚至数组指针,函数指针等。 int a 10; int *pa &a;//整形指针pa接受一个整形变量a的地址…

C语言中的void类型函数

最重要的一点是void类型函数里不能出现return语句 ,因为与常见的int double float char等数据类型不同,void是一个空类型,也就是说函数没有返回值,所以也不给主函数提供(或返回)任何信息 一般声明变量时不…

【C语言】如何理解【void(*)(void)】

1.理解【void(*)(void)】 引用阅读 如何理解【void(*)(void)】 void(*)(void) --表示一个返回值为void,没有参数的函数指针 (void(*)(void))--表示【将func这个函数强转成返回值为void,没有参数的函数】的类型转换 测试sizeof(void(*)(void)) #inc…

C语言中的void

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

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 网络爬虫也叫网络蜘…