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

存储类别、链接与内存管理(一)

1、一些必要的基础概念

(1)对象

  • 从硬件的角度,被存储的每个值都被占用了一定的物理内存,C语言把这样的一块内存称为对象
  • 对象可以存储一个或多个值
  • 一个对象可能并未存储实际的值,也可能存储一个或多个值,但是在存储是适当的值时一定具有相应的大小
  • 要注意的是,面向对象编程语言(例如C++)的“对象”指的是“类对象”不是本章讨论的“对象”,其定义包括数据和允许对数据的操作

(2)标识符

int entity = 3;
int* pt = &entity;
int ranks[10];
  • 标识符是一个名称,用来指定特定对象的内容。例如上面的声明创建了一个标识符entity,entity即是C语言指向硬件内存中的对象的方式
  • 但是变量名不是对象的唯一途径,比如pt整体不是一个标识符,但是可以通过pt来指向一个对象

(3)左值

  • 指定对象的表达式被成为“左值”,提到左值意味着:
    • ①它指定一个对象,可以引用内存中的地址
    • ②它可以出现在赋值运算符的左侧
  • entity是标识符也是左值;*pt是表达式也是左值;
  • ranks+2*entity不是标识符,也不是左值;*(ranks+2*entity)是表达式,也是左值
  • 可修改左值:后来新增了const修饰符,const修饰的变量不可修改,满足第一点但不满足第二点。一方面C语言继续把某些标识对象的表达式定义为左值,另外一方面某些左值不能放在赋值运算符的左侧,因此多了一个细分概念,即“可修改的左值”,当前标准建议用术语“对象定位值”更好

(4)翻译单元和文件

  • 我们认为的多个文件可能会在编译器中以一个文件的形式出现。比如通常在.c文件中,会使用大量的.h文件,头文件还有可能包含其他的.h文件,C预处理器实际上是用包含的头文件内容替换掉#include指令。所以编译器把源文件代码和多个头文件看成是一个包含信息的单独文件,这个文件就叫做“翻译单元”
  • 如果程序由多个源代码构成,那么程序也应该由多个翻译单元,每个翻译单元对应一个源代码文件和它所包含的头文件

2、对“对象”和“标识符”的描述

(1)可以用“存储期”描述对象

存储期:描述通过这些标识符访问对象的生存期

静态存储期,一个变量如果具有静态存储期,那么它在程序的执行期间会一直存在。文件作用域变量就具有静态存储期(无论其是内部还是外部属性)注意注意,对于文件作用域变量,关键字static不是指改变成静态(因为本来就具有静态变量),而是改变其链接
线程存储期,线程存储期多用于并发程序开发,程序执行被分为多个线程。具有线程存储期的对象,从声明到线程结束的时候一直都存在。以关键字_Thread_local声明一个对象时,每个线程都可以获得该变量的私有备份
自动存储期,块作用域的变量通常具有自动存储期。当程序进入定义这些变量的块时,为这些变量分配内存,当退出这个块时,释放刚才为变量分配的内存。这种做法相当于把自动变量占用的内存视为一个可以重复使用的工作区或暂存区。不过变长数组略有不同,它们的存储器从声明处到块的末尾。所有使用的局部变量默认都是自动类别。要想要局部变量具有静态存储期,可以在声明前加上关键字static使其具有静态存储期

void more(int number)
{    int index;static int ct = 0;    //某些代码    return 0;
}

变量ct存储在静态内存中,它从程序中被载入到程序结束期间都存在,但是,他的作用域在块内,只有在使函数more时,才可以直接使用ct访问它指向的对象(但是可以让more函数提供该存储区的地址以便于间接访问该对象)
动态分配存储期,这个涉及到动态分配内存,比较复杂,暂时不讨论

(2)可以用“作用域”和“链接”描述标识符

作用域:描述程序中可以访问标识符的区域

块作用域,主要体现在{}内和函数的形参

void function(void)
{int j = 100;{int j = 10;printf("%d", j);for(int i = 0; i < 10; i++){    printf("%d", i);}}printf("%d", j);
}

变量i只有在最内层{}才可以被使用,j在第二层{}可以被使用(注意j此时值为10而不是100),最外层j的值为100。另外for循环里的i虽然不在最内层{}里,但是也是属于最内存的,具有块作用域,这种特性包括if、while、do等
函数作用域,主要体现在用于goto的标签,这意味着即使goto的标签首次出现在函数的内层块中,它的作用域也是延申到整个函数,这就避免了在一个函数中使用同名标签的情况,避免了混乱
函数原型作用域,主要是用于函数原型中的形参名,范围是从形参定义处到原型声明结束。这就意味着编译器在处理函数原型中的形式参数时只关心它的类型,形参名字通常无关紧要。即使在函数声明中有形参名,也不必与函数定义中的形参相同。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
只有在带有变长数组参数的函数中,形参名才有用void function(int n, int m, arr[n][m]);

文件作用域,文件作用域变量通常也叫做全局变量,“文件”的意义就在于:具有文件作用域的变量,从它的定义处到该文件到定义所在文件的结尾都可以被使用

int units = 100;
void function(void);
int main()
{//某些代码return 0;
}
void function(void)
{//某些代码
}

其中units就是全局变量,具有文件作用域,units从定义开始可以到文件结尾全都可见

链接:描述如何处理在不同文件中出现的标识符

外部链接,具有文件作用域的变量可以是外部链接和内部链接,默认情况下全局变量具有外部链接属性,在其他文件需要这个变量时,要用extern提醒编译器这是一个外部变量
内部链接,具有文件作用域的变量可以是外部链接和内部链接,可以通过static修饰变量来改变成内部链接,只给一个文件私有
无链接,具有块作用域、函数作用域、函数原型作用域的变量都是无链接变量(这很符合“黑盒”这个说话)

3、c语言的存储类别

C提供了很多的存储类
在这里插入图片描述

4、参考来源

来自书籍《C primer puls》第12章的“存储类别、链接和内存管理”章节

相关文章:

存储类别、链接与内存管理(一)

1、一些必要的基础概念 &#xff08;1&#xff09;对象 从硬件的角度&#xff0c;被存储的每个值都被占用了一定的物理内存&#xff0c;C语言把这样的一块内存称为对象对象可以存储一个或多个值一个对象可能并未存储实际的值&#xff0c;也可能存储一个或多个值&#xff0c;但…...

JS设计模式

文章目录1 什么是设计模式&#xff1f;2 发布-订阅模式2.1 DOM事件2.2 基于Broadcast Channel实现跨页面通信2.3 基于localStorage实现跨页面通信2.4 使用 Vue 的 EventBus 进行跨组件通信2.4 使用 React 的 EventEmitter 进行跨组件通信3 装饰器模式3.1 React 高阶组件 HOC3.2…...

四、常用样式讲解二

文章目录一、常用样式讲解二1.1 元素隐藏1.2 二级菜单1.3 相对定位和绝对定位1.4 定位的特殊情况1.5 表格1.6 表格的css属性1.7 表格中新增的标签一、常用样式讲解二 1.1 元素隐藏 如何让一个元素隐藏 1、不定义颜色 占用空间 2、display: none 不占用空间 3、visibility: hi…...

KDHX-8700无线高压核相相序表

一、产品简介 KDHX-8700无线高压核相相序表&#xff08;以下简称“仪器”&#xff09;用于测定三相线相序、检测环网或双电源电力网闭环点断路器两侧电源是否同相。在闭环两电源之前一定要进行核相操作&#xff0c;否则可能发生短路。仪器适用于380V&#xff5e;35kV交流输电线…...

【C++提高笔记】泛型编程与STL技术

文章目录模板的概念函数模板函数模板语法函数模板注意事项函数模板案例普通函数与函数模板的调用规则模板的局限性类模板类模板语法类模板与函数模板区别类模板中成员函数创建时机类模板对象做函数参数类模板与继承类模板成员函数类外实现类模板分文件编写类模板与友元类模板案…...

实用机器学习-学习笔记

文章目录9.1模型调参9.1.1思考与总结9.1.2 基线baseline9.1.3SGD ADAM9.1.4 训练代价9.1.5 AUTOML9.1.6 要多次调参管理9.1.7复现实验的困难9.1模型调参 9.1.1思考与总结 1了解了baseline和调参基本原则 2了解了adams和sgd的优劣 3了解了训练树和神经网络的基本代价 4了解了a…...

2023-02-15 学习记录--React-邂逅Redux(二)

React-邂逅Redux&#xff08;二&#xff09; “天道酬勤&#xff0c;与君共勉”——承接React-邂逅Redux&#xff08;一&#xff09;&#xff0c;让我们一起继续探索Redux的奥秘吧~☺️ 一、前言 React-邂逅Redux&#xff08;一&#xff09;让我们对Redux有了初步认识&#xff…...

Framework——【MessageQueue】消息队列

定义 队列是 Apache RocketMQ 中消息存储和传输的实际容器&#xff0c;也是 Apache RocketMQ 消息的最小存储单元。 Apache RocketMQ 的所有主题都是由多个队列组成&#xff0c;以此实现队列数量的水平拆分和队列内部的流式存储。 队列的主要作用如下&#xff1a; 存储顺序性…...

SpringBoot依赖原理分析及配置文件

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 SpringBoot依赖原理分析及配置文件 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4…...

智慧机场,或将成为航空领域数字孪生技术得完美应用

在《智慧民航建设路线图》文件中&#xff0c;民航局明确指出&#xff0c;智慧机场是实现智慧民航的四个核心抓手之一。这一战略性举措旨在推进数字化技术与航空产业的深度融合&#xff0c;为旅客提供更加智能化、便捷化、安全化的出行服务&#xff0c;进一步提升我国民航发展的…...

SQL64 对顾客ID和日期排序

描述有Orders表cust_idorder_numorder_dateandyaaaa2021-01-01 00:00:00andybbbb2021-01-01 12:00:00bobcccc2021-01-10 12:00:00dickdddd2021-01-11 00:00:00【问题】编写 SQL 语句&#xff0c;从 Orders 表中检索顾客 ID&#xff08;cust_id&#xff09;和订单号&#xff08;…...

MybatisPlus使用聚合函数

前言 今天遇到了一个求总数返回的情况&#xff0c;我一想这不是用sum就完事了吗。 但是仔细想想&#xff0c;MybatisPlus好像没有直接使用sum的api。 虽然没有直接提供&#xff0c;但是办法还是有的&#xff0c;下面就分享下如何实现的&#xff1a; 首先如果使用sql是这么写…...

工程管理系统源码企业工程管理系统简介

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…...

《计算机视觉和图像处理简介 - 中英双语版》:使用 OpenCV对图像进行空间滤波

文章大纲 Linear Filtering 线性滤波器Filtering Noise 过滤噪声Gaussian Blur 高斯滤波Image Sharpening 图像锐化Edges 边缘滤波Median 中值滤波Threshold Function Parameters 阈值函数参数References本文大概需要40分钟 Spatial Operations in Image Processing 图像处理中…...

FreeRTOS软件定时器 | FreeRTOS十三

目录 说明&#xff1a; 一、定时器简介 1.1、定时器 1.2、软件定时器 1.3、硬件定时器 1.4、FreeRTOS软件定时器 1.5、软件定时器服务任务作用 1.6、软件定时器的命令队列 1.7、软件定时器相关配置 1.8、单次定时器和周期定时器 1.9、软件定时器结构体 二、软件定时…...

电脑文件被误删?360文件恢复工具,免费的文件恢复软件

电脑里面保存着各种文件&#xff0c;因为误操作我们把还需要用的文件给删除了。很多人都想要使用不收费的文件恢复软件来进行恢复操作&#xff0c;但是又不清楚有哪些文件可以帮到我们。接下来就给大家介绍&#xff0c;一款真正免费的数据 恢复app&#xff0c;一起来看看&#…...

pg_cron优化案例--terminate pg_cron launcher可自动拉起

场景 在PostgreSQL中我们可以使用pg_cron来实现数据库定时任务 我有一个select 1的定时任务&#xff0c;每分钟触发一次 testdb# select * from cron.job ;jobid | schedule | command | nodename | nodeport | database | username | active | jobname -------…...

Python 之 NumPy 随机函数和常用函数

文章目录一、随机函数1. numpy.random.rand(d0,d1,…,dn)2. numpy.random.randn(d0,d1,…,dn)3. numpy.random.normal()4. numpy.random.randint()5. numpy.random.sample6. 随机种子np.random.seed()7. 正态分布 numpy.random.normal二、数组的其他函数1. numpy.resize()2. nu…...

【目标检测】K-means和K-means++计算anchors结果比较(附完整代码,全网最详细的手把手教程)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大努力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 一、介绍 YOLO系列目标检测算法中基于anchor的模型还是比较多的,例如YOLOv3、YOLOv4、YOLOv5等,我们可以随机初始化a…...

Java高手速成 | 图说重定向与转发

我们先回顾一下Servlet的工作原理&#xff0c;Servlet的工作原理跟小猪同学食堂就餐的过程很类似。小猪同学点了烤鸡腿&#xff08;要奥尔良风味的&#xff09;&#xff0c;食堂窗口的服务员记下了菜单&#xff0c;想了想后厨的所有厨师&#xff0c;然后将菜单和餐盘交给专门制…...

Git:不小心在主分支master上进行修改,怎么才能将修改的数据保存到正确的分支中

1.如果还没有push commit 代码第一步&#xff1a;将所修改的代码提交到暂存区git stash第二步&#xff1a;切换到正确的分支git checkout 分支名第三步&#xff1a;从暂存区中取出保存到正确的分支中git stash pop第四步&#xff1a;重新提交git push origin 分支名2.如果已经p…...

都2023年了,如果不会Stream流、函数式编程?你确定能看懂公司代码?

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 Stream流、函数式编程 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f649;。 ♨️如果…...

亚马逊云科技汽车行业解决方案

当今&#xff0c;随着万物智联、云计算等领域的高速发展&#xff0c;创新智能网联汽车和车路协同技术正在成为车企加速发展的关键途径&#xff0c;推动着汽车产品从出行代步工具向着“超级智能移动终端”快速转变。 挑战无处不在&#xff0c;如何抢先预判&#xff1f; 随着近…...

为什么学了模数电还是看不懂较复杂的电路图

看懂电路并不难。 (1) 首先要摆正心态&#xff0c;不要看到错综复杂的电路图就一脸懵逼&#xff0c;不知所错。你要明白&#xff0c;再复杂的电路也是由一个个的基本电路拼装出来的。 (2) 基础知识当然是少不了的&#xff0c;常用的基本电路结构搞搞清楚。 (3) 分析电路之前先要…...

帮公司面试了一个30岁培训班出来的程序员,没啥工作经验...

首先&#xff0c;我说一句&#xff1a;培训出来的&#xff0c;优秀学员大有人在&#xff0c;我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配&#xff0c;是非常遗憾的事情。 最近&#xff0c;在网上看到这样一个留言&#xff0c;引发了程序员这个圈子不少的…...

勒索软件、网络钓鱼、零信任和网络安全的新常态

当疫情来袭时&#xff0c;网络罪犯看到了他们的机会。随着公司办公、政府机构、学校和大学从以往的工作模式转向远程线上办公模式&#xff0c;甚至许多医疗保健设施都转向线上&#xff0c;这种快速的过渡性质导致了不可避免的网络安全漏洞。消费者宽带和个人设备破坏了企业安全…...

python3 字符串拼接与抽取

我们经常会有对字符串进行拼接和抽取的需求&#xff0c;下面有几个例子可以作为参考。 需求1&#xff1a;取出ip地址的网络地址与网络掩码进行拼接&#xff0c;分别使用shell脚本和python3实现 # echo "192.168.0.1"|awk -F. {print $1"."$2"."…...

Linux就该这么学:存储结构与管理硬盘

Linux系统中常见的目录名称以及相应内容 目录名称应放置文件的内容/boot开机所需文件—内核、开机菜单以及所需配置文件等/dev以文件形式存放任何设备与接口/etc配置文件/home用户主目录/bin存放单用户模式下还可以操作的命令/lib开机时用到的函数库,以及/bin与/sbin下面的命令…...

JSP四大作用域,九大内置对象

面试题&#xff1a;JSP和Servlet的区别&#xff1f;JSP的本质就是servleJSP更加侧重于视图的展示&#xff0c;servlet更注重逻辑的处理。面试题&#xff1a;include指令和jsp:include标签的区别&#xff1f;从效果上来说&#xff0c;没区别。include指令是把两个页面合成一个js…...

机器学习笔记之生成模型综述(五)重参数化技巧(随机反向传播)

机器学习笔记之生成模型综述——重参数化技巧[随机反向传播]引言回顾神经网络的执行过程变分推断——重参数化技巧重参数化技巧(随机反向传播)介绍示例描述——联合概率分布示例描述——条件概率分布总结引言 本节将系统介绍重参数化技巧。 回顾 神经网络的执行过程 上一节…...