C语言中 对变量内存关系的探讨

C语言数据类型和变量的关系 study again. 阅读详情
变量名不占空间
变量:用来标识(identify)一块内存区域,这块区域的值一般是可以更改的,这就是它“变”的由来,但是我们可以通过使用如const等一些修饰符号来限定这一内存区域的操作特性(characteristic),即变量的操作特性。用const修饰的使变量不能更改的就和常量一样的变量叫做常变量。
变量名:是一个标识符(identifier),用来指代一块内存区域,即变量,使用变量使我们操作内存以区域(area),以块(block)为单位,提高了方便性。
你的机器代码中,是不会出现变量名的;变量名是给我们程序员操作内存来使用的。
想想在汇编年代,没有变量名,我们操作内存,都是用地址来直接操作的,还要控制区域大小;当然汇编语言已经有了简单的变量。
对于编译器,它会搜集我们的变量名,比如我们定义了一个全局的int a;那么编译器都为我们做了什么呢?
它会为程序预留4个字节的空间(假设在32位平台),并把我们的变量名“a”保存进符号表,并用这个符号表的索引对应实际的空间。
如果下面出现b = a;那么它就会根据符号表找到变量的真正的物理位置,取得它的值,赋给b。
这是写编译器需要做的,我们需要建立符号表。
但是实际在汇编层次上,操作的都是地址而已,不存在任何名称了。




~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



除了变量名不是内存地址,其他名都是地址。对么?



所谓的其他名无非是函数名、标识符常量名、指针名、数组名、结构名、类名等等。

楼主的话有部分是对的,

比如指针名、数组名、函数名就是地址,它们分别表示指针所指向元素的地址、数组的首地址和函数的入口地址。

变量名虽然不直接表示地址,但可用取地址符号&来获得它所代表的变量的存放地址。因为在定义变量的同时会分配给它相应的空间。

但类和结构只有事例化时才为它分配空间,从而不能用取地址符号&来获得类名或结构名的地址。



变量名是用来标识某个内存块的
地址就是地址啦,如是变量名的话,用取地址运算符&就可以得到它标识的内存块的地址,
而指针变量呢,它本身也是一个变量名,只不过它标识的那块内存存放的是一个地址值



变量是地址的别名..就像刚生的小孩,你只知道他在地球上的某个位置,而不能叫出他名字,给你取个名





~~~~~~~~~~~~~~~~~~~~~~~



定义int a;时,编译器分配4个字节内存,并命名该4个字节的空间名字为a(即变量名),当用到变量名a时,就是在使用那4个字节的内存空间.
5是一个常数,在程序编译时存放在代码的常量区存放着它的值(就是5),当执行a=5时,程序将5这个常量拷贝到a所在的4个字节空间中,就完成了赋值操作.

a是我们对那个整形变量的4个字节取的"名字",
是我们人为给的,实际上计算机并不存储a这个名字,只是我们编程时给那4个字节内存取个名字好用.实际上程序在编译时,所有的a都转换为了那个地址空间了.编译成机器代码后,没有a这个说法了.a这个名字只存在于我们编写的代码中.
5不是被随机分配的,而总是位于程序的数据段中,可能在不同的机器上在数据段中的位置可能不一致,它的地址其实不能以我们常用到的内存地址来理解,因为牵扯到一个叫"计算机寻址方式"的问题,所以写很多都解释不清楚,你自己找本汇编语言的书来学一下吧.........



~~~~~~~~~~~~~~~~~~~~~~~~~~~~

C语言中变量只是标识对应存储单元内的存储内容。与地址的对应关系
int a=3;
a---&a



一一对应啊,变量名只是一个便于记忆识别的名称,编译器会将他编译成相应的内存地址的.

变量都要占据一定的内存。
通过定义该变量的指针, [类型]* 指针名=你要指向的变量名
那么该指针中存储的就是你的变量的内存地址。
&你的变量名 这样就可以直接获取到你的变量地址
或者定义引用 [类型]& 引用名=变量名
该引用可通过变量的地址来对变量进行修改

~~~~~~~~~~~~~~~~~~~~~~~~~

变量名是给编译器看的,编译器根据变量是局部还是全局分配内存地址或栈空间,所谓的变量名在内存中不存在,操作时转换成地址数存放在寄存器中了。

编译器会将合法的变量名放到一个叫“符号表”的一个表中。
每个符号对应一个地址。当你调用此变量时,就会根据此符号表找到对应的地址,然后进行操作。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~



还没有运行怎么会占用内存呢?!(这一点还要怀疑吗!?)

所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以明确计算出来,并且不会再改变,因此它们可以直接存放在可执行文件的特定的节里(而且包含初始化的值),程序运行时也是直接将这个节加载到特定的段中,不必在程序运行期间用额外的代码来产生这些变量。

其实在运行期间再看“变量”这个概念就不再具备编译期间那么多的属性了(诸如名称,类型,作用域,生存期等等),对应的只是一块内存(只有首址和大小),所以在运行期间动态申请的空间,是需要额外的代码维护,以确保不同变量不会混用内存。比如写new表示有一块内存已经被占用了,其它变量就不能再用它了; 写delete表示这块内存自由了,可以被其它变量使用了。(通常我们都是通过变量来使用内存的,就编码而言变量是给内存块起了个名字,用以区分彼此)

内存申请和释放时机很重要,过早会丢失数据,过迟会耗费内存。特定情况下编译器可以帮我们完成这项复杂的工作(增加额外的代码维护内存空间,实现申请和释放)。从这个意义上讲,局部自动变量也是由编译器负责分配空间的。进一步讲,内存管理用到了我们常常挂在嘴边的堆和栈这两种数据结构。

最后对于“编译器分配空间”这种不严谨的说法,你可以理解成编译期间它为你规划好了这些变量的内存使用方案,这个方案写到可执行文件里面了(该文件中包含若干并非出自你大脑衍生的代码),直到程序运行时才真正拿出来执行!



~~~~~~~~~~~~~~
C语言变量内存地址的分配 一个简单的测试[cpp] #include int a; int b; int c; int main() { int x; int y, z; printf("%d/n", &a); printf("%d/n", &b); printf("%d/n", &c); printf("/n"); printf("%d/n", &x); printf("%d/n", &y); printf("%d/n", &z); return 0; } [/cpp] 输出结果: 4214964 4214968 42149 阅读详情

相关推荐

TIA博途编译时提示“该地址不能通过变量进行分配”的原因分析

TIA博途编译时提示“该地址不能通过变量进行分配”的原因分析

Robot_PLC_HMI_Automation 1万+

C 里面 ---变量名-- 和 --地址-- 的关系探讨

变量名不占空间变量:用来标识(identify)一块内存区域,这块区域的值一般是可以更改的,这就是它“变”的由来,但是我们可以通过使用如const等一些修饰符号来限定这一内存区域的操作特性(characteristic),即变量的操作特性。用const修饰的使变量不能更改的就和常量一样的变量叫做常变量。 变量名:是一个标识符(identifier),用来指代一块内存区域,即变量

5062

c语言变量本质分析

变量概念 概念:既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。  变量定义形式: 类型 标识符, 标识符, … , 标识符 ; 例如: int x ; int wordCut , Radius , Height ; double FlightTime , Mileage , Speed ; 变量本质 1、程序通过变量来申请和命名内存空间 int a = 0 2、通过变量名访问内存空间 (一段连续)内存空间的别名(是一个门牌号) 3、修改变

希望我的博客,能帮上你解决学习中工作中所遇到的问题 598

变量名与变量地址的关系:

1.变量的定义:变量是指以标识符为名字,其值可以改变的量。一个变量代表计算机内存中的某一存储单元,该存储单元中存放的数据就是变量的值,而该存储单元的数据可以改变。 2.变量的意义: (1).变量表示中内存的一个存储区域(不同的数据类型,占用的空间大小不一样) (2).该区域有自己的名称和类型 (3).变量必须先声明,后使用 (4).该区域的数据可以在同一类型范围内不断变化 (5).变量在同一个作用域内不能重名 (6).变量三要素 (变量名+值+数据类型) 3.变量名:是一个标识符(ident

m0_53745000的博客 4004

qwindowkit的一个移植,将mainwindow的例程单独移植出来,成为一个小程序,可直接使用,不用那么大一个源码了,使用 Win10+Qt5.12.12+VS2019编译的库

qwindowkit的一个移植,将mainwindow的例程单独移植出来,成为一个小程序,可直接使用,不用那么大一个源码了,使用 Win10+Qt5.12.12+VS2019编译的库。

TIA博途编译时提示“该地址不能通过变量进行分配”的原因分析.docx

TIA博途编译时提示“该地址不能通过变量进行分配”的原因分析

C语言中地址与变量名的关系

CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。 假设变量 a、b、c 在内存中的地址分别是 0X1000、0X2000、0X3000,那么加法运算c = a + b;将会被转换成类似下面的形式: 0X3000 = (0X1000) + (0X2000); ( )表示取值操作,整个表达式的意思是,取出地址 0X1000 和 0X2000 上的值,将

Flemington7的博客 2466

合宙Air780EP速连OneNET:AT+MQTT应用指南

本文详细讲解了合宙Air780EP使用AT指令通过MQTT接入OneNET的过程。

2401_82812461的博客 1390

c语言空间与字节之间的关系,C语言入门基础篇,内存与变量关系

变量与内存本文目录一、字节和地址二、变量的存储三、负数的二进制形式四、变量的作用域五、变量的初始化在前面一节中简单介绍了变量的使用,当我们定义一个变量的时候,系统就会为变量分配一块存储空间。而变量的数值在内存中是以二进制的形式存储的,这讲来深入研究变量在内存中的一些存储细节。回到顶部一、字节和地址为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”。1.计算机中的内存是以字...

weixin_29245767的博客 1398

什么是论文的创新点?公式化描述算是创新点吗?

写科研论文时,挑战之一就是如何让你的工作“脱颖而出”,也就是要有创新性。不管实验多么精确、推导多么复杂,若没有真正的创新,论文很可能会被拒。关于如何创新问题上,我最近在看刘雪峰老师的《科技论文写作指南》,看到了很多关于写作的新论述,在这里和大家进行分享。

加百力 的技术博客 1926

DANN实战:用Python手把手教你实现对抗迁移学习(附完整代码)

本文通过Python实战教程,手把手教你实现DANN对抗迁移学习模型,以解决领域偏移问题。文章详细解析了领域对抗神经网络的核心机制,包括梯度反转层和领域判别器的构建,并提供了从数据准备、模型搭建到训练评估的完整代码,帮助开发者快速掌握这一强大的无监督领域自适应技术。

net55的博客 318

C语言变量类型

这里写自定义目录标题C语言的指针内存的相关操作新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 C语言的指针 C语言是汇编之上最靠近硬件操作的语言,其中最重要的一点便是指针,指针是C语言操作内存的利器,学好指针对理解其它语言

du_dgwt的博客 2862

低代码Agent开发框架使用指南(二)—Coze平台核心功能概览

本篇分享系统介绍了字节跳动推出的低代码智能体开发平台Coze。Coze以免费易用、多模型支持和便捷的跨平台发布为核心优势,显著降低了智能体开发门槛。文章详细解析了平台的六大核心功能:扩展能力边界的插件系统、增强认知的知识库、结构化数据管理的数据库、可视化图像处理的图像流、实现复杂逻辑编排的工作流,以及处理复杂任务的多智能体协作机制,全面展现了Coze平台的强大能力。

weixin_42782643的博客 1358

C语言 - 变量

在C语言中,定义一个变量时,编译器会为该变量分配一块内存区域,并将其关联到一个名字(变量名)。从程序员的视角来看,这个名字就是变量,但从计算机的角度来看,变量只是内存地址的一个。

qq_19343801的博客 691

PID详解

1、什么是PID及其作用 设定一个输出目标,反馈系统传回输出值,如与目标不一致,则存在一个误差,PID 根据此误差调整输入值,直至输出达到设定值. 为什么需要PID呢,比如控制温度,我们需要设置一个要达到的目标温度值,当将温度稳定在目标温度值 例如,我们希望水的目标温度值为70°,其希望无非就是可以快速而且无抖动的达到70°,并稳定在70° 如果我们使用普通的方式加热,当温度到达70°后就以及停止加热,岂不是简单快速,当然用在要求不高的场合也可以,但是如果要求更高的场合呢,会出现温度到达70°后......

weixin_48435215的博客 5万+

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

python与C语言变量内存地址差别

python类似指针 在堆内存中创建对象,通过赋值语句将对象绑定到位于栈内存中的变量上。 变量的值不同,内存地址id()便不同。 C语言 创建变量后,内存固定,不因赋值不同而改变。

cs123456csq的博客 731

解析 RABAX during SAPGUI Logon 错误及其解决方案

登录用户关联了初始启动程序,该程序由于未处理的异常导致运行时错误。在 ST22 查看错误的程序名和错误行。修复初始程序代码中的逻辑问题。重新部署修复后的代码。示例代码:防止未处理的异常TRY." 模拟逻辑处理ENDTRY.此代码通过 TRY-CATCH 块捕获潜在错误,避免程序崩溃。是 SAP 系统中常见的运行时错误,其根源可能涉及多个方面,包括用户配置、系统状态、数据库连接和自定义开发等。通过结合 ST22、SM21 等诊断工具,以及完善的代码实践和系统监控,可以有效预防和解决此类问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1782

c语言局部变量默认初始值

C语言中,定义局部变量时如果未初始化,则值是随机的,这是为什么呢?定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的。c语言中只有局部变量在未赋初值时,才是随机数,全局变量和静态变量未赋初值时编译器会自动将其初始化为0。局部变量...

会飞的鱼的博客 1万+

SI案例分享--考虑ESD保护二极管的差分线阻抗仿真

PCB设计中的cut out参考面早已是SI评估中常用的阻抗优化方式,通过合理的仿真建模,可以提供合适的设计参考,并保持与测试结果的高度一致性。

一只豌豆象的博客 1438

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汇编语言定义变量c,汇编c语言变量

广告Apple iPad,AirPods Pro,Bose耳机,机械键盘,健身环等着您由于c ++支持重载,因此可以使用相同的函数名称但不同的参数类型定义函数. 在编译期间,编译器根据函数的参数类型确定实际的函数名称(或汇编语言中的函数名称). 与c不同,此命名规则更加复杂. 它仅在变量名称和函数名称之前添加下划线. 因此,在c文件中定义了名为name的全局变量或函数,并在cpp文件中定义了......

weixin_34112399的博客 2804

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

简单理解python下的变量和内存

相信学过c的人,对变量和内存了解的差不多,可是,python中他们是一样的吗??? No,(尽管说,python就是用c写的) 1,python下的变量

L未若的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深入理解C语言变量和内存——整理篇

1、基本数据类型变量名和内存的关系:  int i;   scanf_s("%d", &i);int i;,在这一句就为i分配了内存(但尚未对这块内存进行初始化),所以可以通过&i直接使用这块内存。赋值就更不用说啦,i = 3;。变量名i,是为方便编程人员使用,是这块内存的别名,指代到块内存,对编程人员i代表这块内存中存储的值(实际上是i指到这个内存,然后取值)。通常我们都是通过变量名来使用已知的内

wangjun_huster的博客 8971

C语言进阶 ~ 数据类型 &变量&内存四区之间关系详解

内存和数据类型的关系?为什么会引入数据类型? 数据类型本质分析 常见数据类型 数据类型的本质

weixin_44399845的博客 1159

C语言的内存四区

C语言进阶 发表于 2017-07-05 | 分类于 C语言变量本质 变量的本质就是其名称所相对用的内存空间(内存地址)内的数据的别名而已1、程序通过变量来申请和命名内存空间 int a=0;2、通过变量名来访问内存空间(一段连续)内存空间的别名!(相当于一个简易的门牌号)3、变量对内存,可读可写(1)通过变量往内存中读写数据(2)不是向变量读写数据(3)是向变量所代表的内存空间中读写数据#inc

Jin__nan的博客 638

【深入剖析C语言】C语言与内存

✨前言✨ 【深入剖析】系列是【最强C语言】系列的姊妹篇。在【最强C语言】系列里作者准备详细介绍了C语言的各个知识点,适合新手小白快速入手。而【深入剖析】系列旨在加强对C语言的理解而创作,所以这个系列文章适合不仅想学好C语言更想学精C语言的群体。同时作者要坦言,作者不是大佬,知识难免局限,欢迎大家指正错误。 ????‍????作者概况: 就读南京邮电大学努力学习的大一小伙 ????‍????联系方式:2879377052(QQ小号) [有问题欢迎留言讨论,作者尽力帮忙]✨ ????

罅隙的博客 895
上一篇: IOS中的本地通知和后台任务
下一篇: 算法——素数判定方法
RannieR
博客等级 码龄14年 180粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值