C语言深度剖析--不定期更新的第四弹

news2024/11/5 22:56:17

在这里插入图片描述
哈哈哈哈哈哈,今天一天两更!

void关键字

void关键字不能用来定义变量,原因是void本身就被编译器解释为空类型,编译器强制地不允许定义变量
在这里插入图片描述
定义变量的本质是:开辟空间

而void 作为空类型,理论上不应该开辟空间(针对编译器而言),即使开辟了空间,也只是作为一个占位符看待(针对Linux来说)

所以,既然无法开辟空间,也无法作为正常变量使用,既然无法使用,干脆编译器不让它编译变量

void修饰函数返回值和参数

需要注意的点是:C语言中函数可以不带返回值,默认的返回值是int

但是我们平常在编写函数相关的代码的时候还是得带上函数的返回值类型,否则人家会在猜测究竟是默认?还是忘了没有写返回值?

所以在前面用void函数修饰的作用是起到一个提醒和占位的作用

void修饰函数返回值:1.占位符,让用户明确不需要返回值2.告知编译器,这个返回值无法被接受

void充当函数的形参列表:告知用户或编译器,该函数不需要传参

结论:如果一个函数没有参数,将参数列表设置为void,是一个不错的习惯,因为可以将错误提前发现

void指针

void指针可以创建变量,原因在于void*是指针,是指针,空间大小就能明确出来

void*可以被任何类型的指针接受,void * 可以接受任意类型指针(常用)

进一步来说就是库,系统接口的设计上,尽量设计成通用接口

如这样的:
在这里插入图片描述
例子如下:

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

这里产生了一个问题:void类型的指针是否可以计算呢?

在不同的平台上是不一样的,在VS的环境下,是不可以的,但是在Linux的环境下是可以的,主要原因出现在两个平台对于void大小的理解,VS认为void大小为0,但是Linux认为是sizeof(void)

void*指针不可以解引用,虽然void *可以接受任意类型,但是还是不可以解引用

return关键字

两个问题的区别:C语言有没有字符串类型VS C语言有没有字符串

C语言有字符串,但是C语言没有字符串类型

注意点:求字符串长度是不包括‘\0’的,求字符串容量是包括’\0’

计算机中是否真的需要将所有的数据清零?

计算机中清空数据,只需要设置该数据无效即可。

这句话的意思其实不太准确,只是因为我们所学的知识还没有这么多而已,打个比方,一个10GB的文件,可能只需要十个比特位大小,一个比特位代表1GB

接下来看如何正确理解下面的代码:

#include <stdio.h>
char*show()
{
    char str[]="hello cosmic love";
	return str;
}
int main()
{
    char*s=show();
    printf("%s\n",s);
	return 0;
}

在这里插入图片描述
打印结果是一串乱码

这里我们需要懂得函数栈帧相关的知识。

调用函数,形成栈帧;函数返回,释放栈帧

在这里插入图片描述
在这里插入图片描述
但是在调试的时候,s指向的值还在

从12行调试到13行的时候发生了变化
在这里插入图片描述
原因有下面几点:

1.计算机并不清空数据

2.printf也是函数,也要遵守这些规则,所以就二次覆盖了show的栈区

补充2个点:

1.怎样保证栈帧申请的空间是够的?

因为编译器会根据关键字大小预估充足的空间大小

2.栈帧的结构是怎样的?

可以联想我们之前学过的递归的概念,栈帧的创建也是一个不断向下创建的过程

有个问题:临时变量为什么具有临时性?

因为临时变量在函数栈帧中创建,栈帧结构在函数调用完毕之后要被释放

书写规范上的注意:

return语句不可返回指向“栈内存”的指针,因为该内存在函数体结束的时候会被销毁

可以看下面几行代码:

int GetData()
{
	int x=0x11223344;
    printf("run get data!\n");
    return x;
}
int main()
{
	int y=GetData();
    printf("ret:%x\n",y);
}

来看运行结果:

在这里插入图片描述
貌似跟前面有点悖论

这里拿到的不是X,拿到的是里面的内容

看一下里面的反汇编代码:
得到了下面的结论:

在这里插入图片描述
在上面的代码做一点小小的修改:

int GetData()
{
	int x=0x11223344;
    printf("run get data!\n");
    return x;
}
int main()
{
	GetData();
    printf("ret:%x\n",y);
}

在这里插入图片描述
需要注意一个概念:函数的返回值具有常性

结论

一个函数如何返回给外部调用方,本质是通过寄存器;

当我们返回,没有对应的接收时,调用return 会生成同等汇编语言,如果对应的接收方,就会继续往下走

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

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

相关文章

NLP自然语言处理学习过程中知识点总结

OOV是什么 OOV 是 “Out Of Vocabulary”的缩写&#xff0c;意思是 “超出词汇表” 或 “未登录词汇”。 在自然语言处理 (NLP) 中&#xff0c;OOV 指的是模型训练时没有见过的词语或词汇。通常&#xff0c;语言模型会为其训练数据中未出现的词汇分配一个特殊的标记。OOV 词汇…

【国赛急救包】数模国赛查重规则及降重技巧

国赛已经快接近尾声了&#xff0c;各位宝宝论文写得怎么样啦~ 今天为大家分享关于国赛查重的一些规则&#xff0c;以及降重技巧&#xff01;快收藏起来吧~ 1. 国赛查重要求及如何查重 • 数学建模国赛的查重除了知网数据库以外&#xff0c;更重要的是自建库的查重比对&#x…

14.1 为什么说k8s中监控更复杂了

本节重点介绍 : k8s中监控变得复杂了&#xff0c;挑战如下 挑战1: 监控的目标种类多挑战2: 监控的目标数量多挑战3: 对象的变更和扩缩特别频繁挑战4: 监控对象访问权限问题 k8s架构图 k8s中监控变得复杂了&#xff0c;挑战如下 挑战1: 监控的目标种类多 对象举例 podnodese…

【kubernetes】配置管理中心Configmap运用

一&#xff0c;介绍 Configmap&#xff08;简写 cm&#xff09;是k8s中的资源对象&#xff0c;用于保存非机密性的配置的&#xff0c;数据可以用key/value键值对的形式保存&#xff0c;也可通过文件的形式保存。 【局限性】&#xff1a;在ConfigMap不是用来保存大量数据的&am…

Windows下Python和PyCharm的应用(二)__快捷键方式的设定

前言 程序写久了&#xff0c;难免会形成自己的编程习惯。比如对某一套快捷键的使用&#xff0c;已经形成了肌肉记忆。 为了方便快捷键的使用&#xff0c;可以在PyCharm中设置自己喜欢的快捷键。 我比较习惯于微软Visual Studio的快捷键设置。&#xff08;因为早些年VC开发用的…

模具要不要建设3D打印中心

随着3D打印技术的日益成熟与广泛应用&#xff0c;模具企业迎来了自建3D打印中心的热潮。这一举措不仅为企业带来了前所未有的发展机遇&#xff0c;同时也伴随着一系列需要克服的挑战&#xff0c;如何看待企业引进增材制造&#xff0c;小编为您全面分析。 机遇篇&#xff1a; 加…

win11如何录屏

在 Win11 中录屏可以使用系统自带的工具和一些第三方应用。以下是几种方法&#xff1a; 方法一&#xff1a;使用 Xbox Game Bar 1. 打开 Xbox Game Bar - 按 Win G 组合键打开 Xbox Game Bar。 2. 开始录制 - 在显示的界面中&#xff0c;点击“录制”按钮&#xff08;…

Linux之nginx部署项目【前后端分离】(外加redis安装)

nginx安装和访问 1.使用apt安装Nginx apt install -y nginx 用whereis nginx找到和nginx相关目录 nginx目录结构 /usr/sbin/nginx 服务文件 /etc/nginx 配置目录 /usr/share/nginx/html 发部项目 服务名: nginx.service ps -ef | grep nginx apt install -y net-tools …

【Excel 表打印基本操作】

表格打印 1.设置缩放打印1.1 命令启动器、命令组1.2 一页纸打印1.3 自由设置打印缩放比例 2.跨页打印标题3.打印选定区域3.1 打印前/后n行3.2 打印多个表格区域3.3 只打印图表3.4 不打印照片 4.设置分页打印4.1 手动分页&#xff1a;分页预览&#xff0c;分页符a) 手动插入分页…

x86的Docker环境下载ARM版容器镜像

文章目录 应用场景下载方法 应用场景 内网是信创ARM环境&#xff0c;需要从外网下载镜像&#xff0c;但外网的docker环境是X86环境&#xff0c;此时需要在外网docker环境下载ARM版容器镜像。 下载方法 # 如何找sha256参见下面的截图。 # hub.docker网站找到镜像后&#xff0…

插件maven-search:Maven导入依赖时,使用插件maven-search拷贝需要的依赖的GAV

然后粘贴&#xff1a; <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency>

0基础学习爬虫系列:程序打包部署

1.目标 将已经写好的python代码&#xff0c;打包独立部署或运营。 2. 环境准备 1&#xff09;通义千问 &#xff1a;https://tongyi.aliyun.com/qianwen 2&#xff09;0基础学习爬虫系列–网页内容爬取&#xff1a;https://blog.csdn.net/qq_36918149/article/details/14199…

【Python篇】PyQt5 超详细教程——由入门到精通(终篇)

文章目录 PyQt5超详细教程前言第9部分&#xff1a;菜单栏、工具栏与状态栏9.1 什么是菜单栏、工具栏和状态栏9.2 创建一个简单的菜单栏示例 1&#xff1a;创建带有菜单栏的应用程序代码详解&#xff1a; 9.3 创建工具栏示例 2&#xff1a;创建带有工具栏的应用程序代码详解&…

如何在mac上玩使命召唤手游?苹果电脑好玩的第一人称射击游戏推荐

《使命召唤4&#xff1a;现代战争》&#xff08;Call of Duty 4: Modern Warfare&#xff09;是由Infinity Ward开发并于2007年发行的第一人称射击游戏。该游戏是《使命召唤》系列的第四部作品&#xff0c;是一款非常受欢迎的游戏之一&#xff0c;《使命召唤4&#xff1a;现代战…

QT串口读取Serial->readAll()踩过的坑

QT串口读取Serial->readAll接收不完全踩过的坑 Chapter1 QT串口读取Serial->readAll()踩过的坑坑一&#xff1a;坑二 Chapter2 [QT串口上位机BUG解决]json解析数据bug以及接收数据问题问题描述原因分析&#xff1a;解决方案&#xff1a;一、是数据采集端&#xff08;单片…

灰光模块,彩光模块-介绍

1. 引用 知识分享系列一&#xff1a;5G基础知识-CSDN博客 5G前传的最新进展-CSDN博客 灰光和彩光_通信行业5G招标系列点评之二&#xff1a;一文读懂5G前传-光纤、灰光、彩光、CWDM、LWDM、MWDM...-CSDN博客 ADOP带你了解&#xff1a;CWDM、DWDM、MWDM、LWDM&#xff1a;快速…

久久公益节||“携手万顺叫车一起做公益”

99公益日是由腾讯公益联合多家公益组织、企业及社会各界爱心人士共同举办的年度大型公益活动。随着99公益日的到来&#xff0c;同悦社工诚挚地邀请了万顺叫车一起参与今年的公益活动&#xff0c;共同为社会公益事业贡献力量。 在本次公益倡导活动中&#xff0c;万顺叫车将发挥其…

vLLM (5) - LLMEngine下篇

系列文章目录 vLLM (1) - Qwen2推理&部署 vLLM (2) - 架构总览 vLLM (3) - Sequence & SequenceGroup vLLM (4) - LLMEngine上篇 vLLM (5) - LLMEngine下篇 文章目录 系列文章目录前言一、类图二、LLM._validate_and_add_requests()1.LLM2.LLMEngine3.Scheduler 三、L…

颠覆你的开发模式:敏捷思维带来的无限可能

敏捷软件开发作为现代软件工程的重要方法论&#xff0c;强调快速响应变化和持续交付价值。通过灵活的开发模式和高效的团队协作&#xff0c;敏捷方法在应对动态变化和不确定性方面表现出色。本文将结合学习和分析&#xff0c;探讨系统变化对敏捷开发的影响、业务与技术的对齐以…

axure之变量

一、设置我们的第一个变量 1、点击axure上方设置一个全局变量a 3 2、加入按钮、文本框元件点击按钮文档框展示变量值。 交互选择【单击时】【设置文本】再点击函数。 点击插入变量和函数直接选择刚刚定义的全局变量&#xff0c;也可以直接手动写入函数(注意写入格式。) 这…