C语言——小细节和小知识10

一、全局变量和局部变量

1、引例

当全局变量和局部变量名字相同的情况下,局部变量优先。

#include <stdio.h>int num = 10;int main()
{int num = 0;printf("%d\n", num);return 0;
}

运行结果

2、介绍

在C语言中,当局部变量和全局变量的名字相同时,程序会优先使用局部变量,这是由语言的作用域规则决定的。作用域是指程序中可以访问变量的区域。以下是两种变量作用域的简要说明:

局部变量

  • 局部变量是在函数或代码块内部定义的变量。
  • 它们只在定义它们的函数或代码块内部可见。
  • 当程序的执行离开该函数或代码块时,局部变量的生命周期结束,并且它们所占用的内存可能被释放或用于其他目的。

全局变量

  • 全局变量是在所有函数和代码块之外定义的变量。
  • 它们在程序的整个运行期间都是可见的,并且它们的值在函数调用之间是持久的。
  • 全局变量的生命周期从它们被定义的时刻开始,直到程序结束。

为什么局部变量优先

  • 这个规则允许函数对外部变量进行"屏蔽",使用自己的局部变量,而不受全局变量的影响。
  • 这是封装和模块化的一个方面,可以防止函数之间因全局变量造成的不必要的数据依赖和影响。
  • 这样,函数可以独立于程序的其他部分工作,使得代码更易于理解和维护。

建议不要全局变量和局部变量名字设为相同。

二、const修饰变量

1、引例

const修饰的常变量既有常属性又有变属性。

	const int num = 0;num = 10;

这个写法是错误的,编译器会报错,这是因为const修饰的变量有“常属性”,它们不能被更改。

我们知道C99之前的标准都不允许变长数组,所以数组初始化时[]内只能用常量,例如:

	int arr[10] = { 0 };

但是,如果在C99之前的标准中使用下面的代码,则会报错:

	const int num = 0;int arr[num] = { 0 };

这代表num还具有“变属性”。

2、介绍

在C语言中,const 关键字用于声明一个变量为常量。这意味着一旦被初始化后,这个变量的值就不应当被修改。从表面上看,const 修饰的变量具有“常属性”,即它们的值在定义后不可改变。

然而,const 修饰的变量在某些情况下确实展示出一定的“变属性”:

  1. 指针与const

    • const修饰指针时,可以声明指向常量的指针(const*之前)或常量指针(const*之后)。
    • 指向常量的指针意味着不能通过该指针修改其指向的值,但指针自己的值(即存储的地址)可以修改,指向不同的变量。
    • 常量指针则意味着指针存储的地址不可改变,但指向地址的值可以改变。
    • 这个在我之前的文章《C语言——实用调试技巧》中提到过。
  2. 通过指针修改const

    • 尽管const变量本身不应该被修改,但如果将const变量的地址赋给一个非const指针,通过指针间接改变其值是可能的。这样做时,需要强制类型转换来绕过编译器的类型检查,这种行为是未定义的(undefined behavior)并且强烈不推荐。
  3. 存储在可写内存区域

    • const变量通常存储在程序的只读数据段,但如果const变量是通过malloc等动态内存分配函数创建的,它实际上存储在堆区,是可以修改的。

举例来说,如果你声明了一个const整型变量:

const int a = 10;

这个变量a应该在整个程序中保持值不变。尝试修改a,比如a = 20;将会导致编译器错误。

然而,如果你使用指针绕过这个限制,像下面这样:

const int a = 10;
int* p = (int*)&a;
*p = 20;

这个代码片段试图修改一个const变量的值,这是未定义行为。在某些平台和编译器上,它可能导致程序崩溃或其他不可预测的行为,因为a可能存储在只读内存段。即使它“工作了”,这也是一个不好的编程实践,应该避免。

实际上这里虽然表面上a的值被更改了,实际上a的值可能没有变化。

因为:

  1. 编译器优化:因为 a 被声明为 const,编译器可能已经对代码进行了优化,将 a 的值当成一个常量直接嵌入到了代码中,因此打印的时候直接使用了原始的常量值10,而不是去内存中读取 a 的实际值。

  2. 缓存机制:在某些架构中,CPU可能将 const 变量缓存到寄存器中,因此改变内存中的值不会影响到寄存器中的值。

  3. 未定义行为:由于修改 const 变量的值是未定义行为,所以实际上任何结果都是可能的,包括没有改变、改变了值、程序崩溃、或者其他奇怪的副作用。

总体来说,正确使用const可增加程序的可读性和健壮性,它是一个告诉编译器和其他开发者某个值不应被改变的好方法。任何尝试绕过const的方法都是不安全的,并且应该被视为错误的编程实践。

三、硬件和软件

1、大致分层

上层应用软件
下层(底层)操作系统
驱动层
硬件

2、详细分层

更详细的层次结构:

  1. 硬件(Hardware):这是计算机系统的最底层,包括处理器、内存、硬盘、显卡、网络适配器等物理设备。

  2. 固件(Firmware)/BIOS/UEFI:这是软硬件之间的一个中间层,通常嵌入在硬件中,为硬件提供最基本的控制和系统启动的功能。

  3. 驱动层(Drivers):驱动软件使操作系统能够与硬件设备通信。它们通常是操作系统的一部分,但有时也由硬件制造商提供。

  4. 操作系统(Operating System, OS):操作系统是软件与硬件之间的接口层,提供文件管理、内存管理、进程管理等基本服务,并允许用户与系统交互。

  5. 中间件(Middleware):中间件是位于操作系统和应用软件之间的软件,为应用程序提供通信和数据管理的服务,这样的例子包括数据库系统、Web服务器和某些API。

  6. 应用软件(Application Software):这是用户直接使用的软件层,包括办公软件、图像处理软件、游戏、数据库应用程序等。

这是一个模块化的视图,每一层都建立在前一层的基础之上,为上层提供服务。在实际应用中,某些层次可能会有不同的划分方式,特别是在不同的操作系统架构和计算机架构中。

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

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

相关文章

高光谱分类论文解读分享之基于生成对抗性少数过采样的高光谱图像分类

IEEE TGRS 2022&#xff1a;基于生成对抗性少数过采样的高光谱图像分类 题目 Generative Adversarial Minority Oversampling for Spectral–Spatial Hyperspectral Image Classification 作者 Swalpa Kumar Roy , Student Member, IEEE, Juan M. Haut , Senior Member, IE…

【野火i.MX6NULL开发板】ARM-GCC 和开发板的 HelloWorld(ubuntu主机和野火开发板debian交叉编译)、开发板的/mnt里没文件

0、前言 参考资料&#xff1a; 《野火 Linux 基础与应用开发实战指南基于 i.MX6ULL 系列》PDF 第24章 参考视频&#xff1a; https://www.bilibili.com/video/BV1JK4y1t7io?p26&vd_sourcefb8dcae0aee3f1aab700c21099045395 注意&#xff0c;一定要记得把虚拟机的网络适配…

J3-DenseNet实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 环境步骤环境设置数据准备图像信息查看 模型构建模型训练模型效果展示 总结与心得体会 环境 系统: Linux语言: Python3.8.10深度学习…

接口自动化神器 apin【 快速入门篇】

关于自动化测试&#xff0c;这些年经历了太多的坑&#xff0c;有被动的坑&#xff0c;也有自己主动挖的坑&#xff0c;在这里做了一些总结。 一、apin 介绍及安装 1、什么是 apin apin是一个无需写代码&#xff0c;就可以进行接口自动化测试的框架&#xff0c;只需要通过jso…

【线路图】世微AP5160宽电压降压型恒流芯片 LED电源 带调光SOT23-6

这是一款14-18V 3A 电流的PCB设计方案. 运用的是世微AP5160 电源驱动IC,这是一款效率高&#xff0c;稳定可靠的 LED 灯恒流驱动控制芯片&#xff0c;内置高精度比较器&#xff0c;固定 关断时间控制电路&#xff0c;恒流驱动电路等&#xff0c;特别适合大功率 LED 恒流驱动。 …

59.说一下 spring 的事务隔离?

spring 的事务隔离有什么作用? 用来解决并发事务所产生一些问题,并发会产生什么问题? 1.脏读2.不可重复度3.幻影读事务隔离的概念 通过设置隔离级别可解决在并发过程中产生的那些问题分别举例说明 1.脏读 上述图表示:一个事务,读取了另一个事务中没有提交的数据,会在…

组播的原理和使用

目录 测试代码(python)Linux工具 测试代码(python) code1: python实现一个使用socket模块创建一个组播套接字并将当前主机加入到该组播中。这个例子使用了组播地址"224.1.1.1"和端口5007&#xff0c;这个脚本可以用于验证功能或协助测试&#xff0c;定位问题。 imp…

【AD-3D预览-颜色更换和模型操作】AD打开3D预览模式,PCB板子显示蓝色,如何更改为绿色

问题&#xff1a;AD软件的3D预览模式中&#xff0c;PCB的颜色和其他不一样&#xff0c;显示的是蓝色&#xff0c;而且正面可以看到走线&#xff0c;背面看不到 原因&#xff1a; 这是因为选择的查看模式不一样所导致的。 在这个位置可以查看当前所使用的模式是什么&#xff0…

IPKISS ------ 远程服务器 IPKISS 内置示例安装问题

IPKISS ------ 远程服务器示例安装问题 引言正文 引言 很多时候&#xff0c;如果我们在服务器上使用管理员权限安装了 IPKISS 证书&#xff0c;而我们使用个人账号登录服务器时有时候会显示如下界面&#xff1a; 我们会看到这个 PyCharm (Luceda Academy) 是灰色的。那么该怎…

高阶函数和函数的柯里化

一、高阶函数 定义&#xff1a; 如果一个函数符合下面2个规范中的任何一个&#xff0c;那该函数就是高阶函数&#xff1a; 1、若 A 函数&#xff0c;接受的参数是一个函数&#xff0c;那么 A 就可以称为高阶函数。2、若 A 函数&#xff0c;调用的返回值依然是一个函数&#x…

嵌入式行业算青春饭吗?

今日话题&#xff0c;嵌入式行业算青春饭吗&#xff1f;嵌入式行业的技术要求确实非常广泛&#xff0c;需要深厚的知识广度和深度。这意味着入行门槛较高&#xff0c;我们需要了解不仅是软件和硬件&#xff0c;还要熟悉底层接口和硬件信号的处理方式&#xff0c;了解数据在计算…

网络文件共享服务、FTP和yum仓库

目录 一、存储类型 1、存储类型一共分为三种&#xff1a; 2、三种存储架构的应用场景 二、FTP文本传输协议 1、FTP工作原理介绍 2、FTP数据连接模式 3、svftpd的安装和配置 4、vsftpd的配置作用 5、黑名单和白名单的使用&#xff08;简要介绍&#xff09; 三、YUM 1…

芯品荟 | 温控器、线控器市场调研报告

PART ONE 产品简介 一、什么是温控器、线控器 温控器\线控器属于工业测量及智能家居产品&#xff0c;目前主流的包括LCD段码屏、TFT液晶屏。 PART TWO 市场规模 智能家居线控器市场规模 智能家居已成为最具潜力的消费科技市场&#xff0c;2022年市场规模约为6515.6亿元。 …

【leetcode 2719.统计整数数目】特殊动态规划之数位DP(数位动态规划)

2719. 统计整数数目 题目描述 给你两个数字字符串 num1 和 num2 &#xff0c;以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件&#xff0c;我们称它是一个好整数&#xff1a; num1 < x < num2min_sum < digit_sum(x) < max_sum. 请你返回好整数的…

微信小程序定义并获取日志/实时log信息

步骤一&#xff1a;开通实时日志 可以在开发者工具->详情->性能质量->实时日志&#xff0c;点击前往&#xff0c;在浏览器打开we分析界面&#xff1a; 也可登录小程序管理后台&#xff0c;点击统计进入we分析&#xff1a; 在we分析界面找到性能质量&#xff0c;打开实…

【提示学习论文七】Visual Prompt Tuning论文原理

文章目录 Visual Prompt Tuning&#xff08;VPT&#xff09;文章介绍Abstract1 Introduction2 Related Work3 Approach3.1 准备工作3.2 Visual-Prompt Tuning(VPT)3.2.1 VPT-Shallow3.2.2 VPT-Deep3.2.3 Storing Visual Prompts 存储视觉提示 4 实验主要结果模型设计变体的消融…

Python文本向量化入门

一、引言 文本向量化是将文本数据转换为数值型格式的过程&#xff0c;以便能够使用机器学习算法进行训练和预测。在Python中&#xff0c;文本向量化通常使用词袋模型&#xff08;Bag of Words&#xff09;或TF-IDF等统计方法来实现。本文将介绍如何使用Python进行文本向量化&a…

抠图换背景的工具有吗?分享4款好用的!

在数字时代&#xff0c;设计已经成为了我们生活中不可或缺的一部分。无论是为了工作还是个人爱好&#xff0c;我们都需要掌握一些设计技能。其中&#xff0c;抠图换背景是一项非常重要的技能。那么&#xff0c;有哪些工具可以帮助我们快速、准确地完成这项任务呢&#xff1f;今…

公司运营数据分析大屏:引领企业决策,驱动业务增长

在数字化时代&#xff0c;数据已经成为企业决策的关键。为了更好地洞察市场趋势、优化业务流程、提升运营效率&#xff0c;越来越多的企业开始引入数据分析大屏以分析公司运营状况。这一创新举措不仅改变了传统的管理模式&#xff0c;更引领企业迈向智能化决策的新篇章。 公司运…

什么是CDN(内容分发网络)

CDN通过在全球范围内分布的服务器网络优化数据传输&#xff0c;大幅提升了网站性能和用户体验。 将详细介绍CDN的工作原理、应用和它如何改变我们访问互联网内容的方式。 CDN的基本概念 定义&#xff1a;CDN是一组分布在多个地理位置的服务器网络&#xff0c;旨在通过更接近用…