【C语言】void 和 void* 类型

news2024/11/24 22:40:45

一. 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://www.coloradmin.cn/o/431944.html

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

相关文章

Direct3D 12——模板——平面阴影效果

平行光阴影 图展示了由平行光源经物体所投射岀的阴影。给定方向为L的平行光源,并用r(t)p tL来表 示途经顶点p的光线。光线r (t)与阴影平面(n,d)的交点为S。以此光源射出的光线照射到物体的各个顶点&#x…

Stable Diffusion本地搭建windows and linux(附搭建环境)

linux搭建过程以centos为例 1.使用git工具下载项目文件到本地文件夹,命令如下: git clone https://github.com/IDEA-CCNL/stable-diffusion-webui.git然后进入该文件夹: cd stable-diffusion-webui2.运行自动化脚本 运行webui.sh安装一些p…

2023最新接口自动化测试面试真题详解,看完轻松拿捏HR

目录 一.有接口测试工具为什么还需要开发自动化框架或自动化平台。 二.接口自动化中如果一个接口请求不通该如何排查 三.你平常做接口自动化的过程中发现过哪些bug?多吗? 四.你在接口自动化中是怎么校验接口返回结果是否正确? 五、接口自动化回归过程中…

【C生万物】 操作符篇

欢迎来到 Claffic 的博客 💞💞💞 前言: 我觉得学习语言,最直接的就是懂不懂符号,而符号中最突出的就是操作符,这期带大家认识认识C语言中的操作符及其使用。 目录 Part1:算数操作符 Part2:移…

直方图均衡化(调节图像亮度、对比度)

直方图均衡化(调节图像亮度、对比度) 本篇目录 🦄 一、前言 🦄 二、直方图均衡化概念 🦄 三、直方图均衡化实例 (1)、灰度图像的均衡处理实例 ①、卡通人物灰度图像均衡处理 ②、卡通猫头…

音频编辑开发SDK Audio DJ Studio for .NET Crack

11.7版本--Audio DJ Studio for .NET是 MultiMedia Soft 开发的 .NET Windows Forms 自定义控件,可以轻松地向使用Microsoft Visual Studio编写的Winform和WPF 应用程序添加声音播放和混音功能;由于与 DirectShow 编解码器和 BASS 库的集成,两…

【UITableView和UITableViewCell的常见属性 Objective-C语言】

一、UITableView和UITableViewCell的常见属性, 1.我们说,这些属性里面, 2.这些是不是都是单元格的属性, 1)这个imageView:是单元格里面的图片框,是不是指的是这个啊, 2)这个textLabel:是指的这个标题上面这个Label吧, 3)这个detailTextLabel:是指的标题下面这…

安装tomcat8,配置服务启动脚本,部署jpress应用

1. 简述静态网页和动态网页的区别。 静态网站顾名思义就是不能动的网站,其中的内容一旦做好就固定了。而动态网站是一种网页编程技术,它可以使得浏览器和服务器可以交互,根据服务器的不同请求动态的生成网页内容。 3. 简述 Webl.0 和 Web2.…

基于STM32的倒车雷达系统设计

目录 前言 一、绪论 1.1 设计背景 1.2 设计内容 二、系统硬件设计 2.1 硬件系统框图 2.2 主控制电路 2.3 超声波电路 2.4 OLED显示电路 2.5 键盘输入电路 2.6 声光报警模块电路 三、系统软件设计 3.1 系统主程序设计 3.2 OLED显示程序设计 3.3 键盘设定程序设计…

设计模式-结构型模式之外观模式

4. 外观模式4.1. 模式定义外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式…

C++11 make_shared函数和std::make_unique详解

make_shared的使用: shared_ptr<string> p1 make_shared<string>(10, 9); shared_ptr<string> p2 make_shared<string>("hello"); shared_ptr<string> p3 make_shared<string>(); 好处&#xff1a;减少分配次数 std::s…

大厂面试内幕:阿里内部整理出的5000页Java面试复盘指南,起飞!!!

互联网的技术岗一直是高薪的代名词&#xff0c;特别是大厂&#xff0c;应届生的年薪基本都20W起&#xff0c;比一般的公司高多了。 看下面这张网上热传的大厂应届生薪酬表就知道了&#xff0c;SP offer甚至能拿到30W以上。 技术社区也有晒出高薪offer的同学&#xff1a; 除了薪…

Unity LOD 技术

Unity LOD 技术 LOD(Level of detail) 多层次细节&#xff0c;常用的Unity 优化技术 它是根据物体在游戏画面中所占视图百分比来调用显示不同精度的模型 说白了就是 当物体距离摄像机距离较近时显示高精度模型 当物体距离摄像机距离较远时显示低精度模型 优点&#xff1a;优化…

Python深度学习实现DIY专属个人表情包

引言&#xff1a; 在现代社交媒体的时代&#xff0c;表情包已经成为了人们日常生活中不可或缺的一部分。表情包可以用来表达情感、传递信息&#xff0c;甚至成为一种文化符号。然而&#xff0c;随着表情包的日益普及&#xff0c;大量的表情包已经不能满足人们的需求&#xff0…

如何对图片批量重命名?

对于爱好摄影的朋友们来说&#xff0c;不管是手机还是相机拍摄的照片&#xff0c;在导入电脑后&#xff0c;它们的文件名通常都是一串长长的乱码。这不仅会导致桌面看起来杂乱无章&#xff0c;还会给我们查找图片带来很多不便&#xff0c;有时候丢失几张图片都发现不了。不过&a…

7、在vscode上利用cmake构建多文件C++工程

文章目录 &#xff08;1&#xff09;创建如下工程文件夹&#xff1a;其中头文件放在include文件夹中&#xff0c;源文件放在src文件夹中&#xff08;2&#xff09;在vscode上打开工程文件夹&#xff0c;在对应的文件夹内建立相应的文件1&#xff09;目录结构2&#xff09;各文件…

【C语言督学训练营 第十一天】三篇文章吃透数据结构中的线性表(二)----- 链表的增删改查与销毁

文章目录 前言一、链表1.基本介绍2.增删改查原理与实战 总结与源码 前言 谭浩强老师说过&#xff1a;“指针是c语言的灵魂”&#xff0c;今天说到的链表就是由C语言的灵魂所筑&#xff0c;学会了链表之后可以使用链表轻松实现树、图等数据结构&#xff0c;可以轻松化解考研数据…

《无线神经调节的微创技术治疗慢性顽固性疼痛:初步观察报告》

**全文概况 **&#xff1a;该文件讨论了一种新型无线和微创神经调节设备&#xff0c;用于治疗之前曾经失败的患者慢性顽固性疼痛。该设备通过经皮植入的电极远程控制&#xff0c;进行高频背根节神经刺激或周围神经刺激。该系统对于患有腰腿疼痛的患者有重要潜力&#xff0c;因为…

车载 Android开发面试习题整合~

随着车联网技术的不断发展和普及&#xff0c;越来越多的汽车厂商开始使用 Android 操作系统作为车载娱乐和信息娱乐系统的核心。在这个趋势下&#xff0c;车载 Android 应用开发程序员的需求也日益增加。 像一些车企大厂在广招这方面的技术人才。给原本处于落寞的Android 开发行…

PTA:C课程设计(7)

山东大学&#xff08;威海&#xff09;2022级大一下C习题集&#xff08;7&#xff09;函数题7-6-1 递增的整数序列链表的插入7-6-2 查找学生链表7-6-3 统计专业人数7-6-4 建立学生信息链表编程题7-7-1 查找书籍7-7-2 找出总分最高的学生函数题 7-6-1 递增的整数序列链表的插入…