当前位置: 首页 > news >正文

C语言深度剖析(部分)--剩下随缘更新

C语言深度剖析

关键字auto-最宽容大度的关键字

变量的分类

代码块:用{ }括起来的区域

局部变量:包含在代码块中的变量,局部变量具有临时性,进入代码块,自动形成局部变量,退出代码块自动释放。

全局变量:在所有函数外定义的变量。全局变量具有全局性。

作用域概念:指的是该变量可以被正常访问的代码区域

#include <stdio.h>
int main()
{int x=10;if(x==10){y=20;printf("%d %d",x,y);//x,y均可打印}printf("%d %d",x,y);//y会报错return 0;
}

局部变量:只在本代码块内有效

全局变量:整个程序运行期间都有效

生命周期

概念:变量从定义到被释放的时间范围,所谓的释放,是指曾经开辟的空间“被释放”

局部变量:进入代码块,形成局部变量(开辟空间),退出代码块,“释放”全局变量

全局变量:定义完成之后,程序运行的整个生命周期内,该变量一直有效

作用域VS生命周期

打个比方来说,有一位大富豪,从他出生到死亡所做的贡献,从时间的维度上来理解,我们可以说是生命周期,他所影响的范围可以叫做作用域,作用域更偏向于空间的维度来说

再来举个例子:

#include <stdio.h>
int g_val=20;
int main()
{int g_val=100;printf("%d",g_val);return 0;
}

当局部变量和全局变量命名起冲突的时候,编译器会优先考虑局部变量,所以打印结果为100

可以理解为就近原则

总结

作用域:该变量的有效范围

生命周期:时间的概念,什么时候被开辟,什么时候被释放
在这里插入图片描述

auto相关

如何使用:一般代码块中定义的变量,即局部变量,都是auto关键词修饰的,不过一般都是省略的

默认所有的变量都是auto修饰的吗?

不是,一般用来修饰局部变量

局部变量,临时变量,自动变量统称为局部变量

auto关键字已经很老,永不使用,在C语言中,但是C++和这个不一样

关键字 register-最快的关键字

铺垫知识:

在这里插入图片描述

寄存器的本质

在硬件层面上,提高计算机的运算效率。因为不需要从内存中读取数据啦。

register修饰变量

尽量将所修饰的变量放到CPU寄存区中,从而达到提高效率的目的

那么什么样的变量可以用register

1.局部的(全局会导致CPU寄存器长时间被占用)

2.不会被写入的(写入就需要写回内存,后续还需要读取检测,那么register的意义何在?)

3.是高频被读取的(提高效率)

4.如果要使用,不是大量使用(寄存器数量有限)

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

结果可以被正常打印,但是既然是存放在寄存器中,也就不是存储在内存中,所以不可以使用取地址符号&

关键字static-最名不副实的关键字

对extern声明的小小补充

当我要对一个函数进行声明的时候可不可以像如下情况:

extern int v_gal=100;

对这个变量进行了赋值,这是不可以的,因为声明并没有开辟空间,=100这是开辟空间或者初始化

所以我们得出结论

所有的变量声明的时候不能设置初始值

再来将讲一点:

我们这里是main.c这个源文件去调用test.c里的show()函数,倘若还有test1.c,test2.c,test3.c要去调用这个show()函数呢,所以:

单纯地使用源文件,组织项目结构的时候,项目越大越复杂的时候,维护成本会变得越来越高

这样也就诞生了头文件 .h

.h:头文件,组织项目结构的时候,减少大型项目的维护成本

接下来是对维护成本的解释:
还是拿刚刚的例子来举例,如果说我们要把上面的v_gal改成v_gal2,那么我们是不是要把所有的源文件声明的位置进行改动,如果说漏掉一个,,都会导致程序运行错误,这里还好只有四个源文件,但是如果是四十个,或者四百个呢,你试想一下。

综上,我们都在回答一个问题:为什么要有头文件

有关头文件的补充说明:

.h基本上都是要被多个源文件包含的,可能有一个问题,头文件被重复包含的问题,会导致运行效率降低

解决方案

在头文件开头写上#pragma once(**PS:**在VS2022中会默认加上#pragma once)
在这里插入图片描述

头文件包含以下内容:

  • C头文件

  • 所有的变量的声明

  • 所有的函数的声明

  • #define ,类型typedef, struct

在C语言中,包含头文件的两种形式

#include <stdio.h>这种是C语言库里面要包含的头文件

#include"test.h"是包含自定义的头文件

这个地方我们要特别注意的是函数的声明,因为在链接的过程中,test.c和main.c会进行匹配看是否有show()函数,即使说你已经定义了该函数,但是你没有声明的时候,编译器会忽视,所以要进行声明

书写如下:
在这里插入图片描述

不向里面添加函数体,道理和声明变量一个道理

注意

变量声明必须带上extern!!!

虽然在实际应用的时候编译器不会报错,但是你会无法区分是开辟空间还是声明变量

函数声明建议带上extern,为什么是建议呢。因为区别在于有没有函数体,编译器在识别的时候如果没有看到函数体会默认是函数的声明

几个小问题:

1.全局变量可以跨文件访问吗?可以

2.函数可以跨文件访问吗?可以

在具体的应用场景中,有没有可能我们不想让全局变量或者函数跨文件访问,指向本文件内部被访问

请出我们真正的主角-------static

在这里插入图片描述

看上面这幅图片,LNK表示的是链接的意思,这里是链接错误

static int g_val =100;//全局变量

访问吗?可以

在具体的应用场景中,有没有可能我们不想让全局变量或者函数跨文件访问,指向本文件内部被访问

请出我们真正的主角-------static

[外链图片转存中…(img-pPVbonaX-1723038243763)]

看上面这幅图片,LNK表示的是链接的意思,这里是链接错误

static int g_val =100;//全局变量

结论1:static修饰全局变量,该变量只能在本文件内被访问,不能被外部其他文件直接访问(可以被间接访问,如被函数调用)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024.08.01 校招 实习 内推 面经
  • 2024年8月7日(mysql主从 )
  • Kafka + Kraft 集群搭建教程,附详细配置及自动化安装脚本
  • 51单片机-第八节-蜂鸣器
  • 破解PyCharm插件更新难题:让IDE焕发新生
  • Java如何使用 HTTP 请求下载图片
  • 如何通过淘口令链接获取该商品的详情数据?(电商API接口)
  • 2024河南省萌新联赛第四场I
  • 数据结构复杂度
  • 几款免费的时序数据库对比
  • 2024【大模型的实战应用深入解析】(非常详细)零基础入门到精通,收藏这一篇就够了
  • cad文字转arcgis注记
  • 常见中间件漏洞(二、WebLogin合集)
  • 下载mmcv或者mmcv-full第三方库失败(已解决)
  • 恶意软件研究之静态检测
  • ES6--对象的扩展
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript学习总结——原型
  • Shadow DOM 内部构造及如何构建独立组件
  • Spring-boot 启动时碰到的错误
  • Webpack 4x 之路 ( 四 )
  • 技术:超级实用的电脑小技巧
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 数据结构java版之冒泡排序及优化
  • 用jquery写贪吃蛇
  • 最近的计划
  • 数据库巡检项
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #if 1...#endif
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (1) caustics\
  • (55)MOS管专题--->(10)MOS管的封装
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (四)linux文件内容查看
  • (源码分析)springsecurity认证授权
  • (转)nsfocus-绿盟科技笔试题目
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net framework 4.8 开发windows系统服务
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net 获取某一天 在当月是 第几周 函数
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net反混淆脱壳工具de4dot的使用
  • .NET使用存储过程实现对数据库的增删改查
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .Net中的集合
  • [ C++ ] STL---仿函数与priority_queue
  • [ActionScript][AS3]小小笔记
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [C++提高编程](三):STL初识
  • [DevEpxress]GridControl 显示Gif动画
  • [emacs] CUA的矩形块操作很给力啊
  • [HDU] 1054 Strategic Game 入门树形DP