从内存和内存的分区的角度来理解数据类型 、变量、指针。

【C++】深度理解C++数据类型:常量、变量、数组、字符串、指针、函数 用array数组,虽然要增加点开销,但要方便很多,比如计算数组长度.size即可,还有像边界检查等我们都不需要考虑了。数组就是一个变量(数组)中有多个变量(各个元素)数组中的所有元素是连续放在某一块儿内存区域的。数组名就是这个数组在内存中的第一个元素的地址。 阅读详情

一、什么事数据类型?

      数据类型可以理解为是 代表一定大小的内存块的别名。

     例如:整型 int ,他代表的是固定大小为4个byte的内存块;short 是固定1 byte 的内存块。

    当我们使用内存的时候,就会去内存空间去申请相应大小的内存块。

  例如:int num = 1;  我们理解为在内存空间里申请了4 byte 大小的内存块 来存放数值 1.(那num 又如何理解呢?继续看下面的分析)

二、 什么是变量?

     曾经我经常会把变量当作是一块内存,其实不然。变量的理解应该是 :

     1、概念:既能读又能写的内存对象。若一但初始化就不能修改的内存对象称之为常量。

     2、定义形式: 数据类型 标识符;

     变量的本质:

      前面说了int num = 1;是在4 byte的内存块中存放了数值1,那么num是代表这个内存块吗?我把num理解为是这块内存的标号,是这个内存块的首地址,在他之后的4 byte内存区域都是我们申请的内存区域。当我们对num 取地址操作的时候(&num)就会得到这块内存的起始地址。

   1、程序通过变量来申请和命名可用内存空间 ,并且给予数据类型。int num = 1;

   2、通过变量来访问一段内存空间,这段空间的名字(门牌)是num,大小长度是数据类型(int)决定的。

   3、修改变量的方法:

           (1) 直接:  num = 10;

            (2) 间接:  首先我们可获得要操作的内存块的地址  # 然后通过地址进行对内存空间的内容做修改。

    4、变量的四要素:名称、大小、作用域、生命周期。


*******上面所说的操作不是对变量进行读写操作,实质都是对内存空间进行操作,那么变量num跑哪去了呢?继续思考。。。内存的分区分析。


  三、内存的分区:

        大概可以把内存分为几个区:代码区,全局区(静态区)(static),常量区,堆区,栈区。(当然这里没有进行更细致的分析)

        代码区:存放程序的二进制代码。(不进行研究考虑)

        全局区(静态区)(static):有操作系统进行管理,该区域在程序结束后有操作系统进行释放回收。(其中对全局变量和静态变量初始化的在一个区,没有初始化的在另一个区bass段)。申请的全局变量或者静态变量,他们的生命周期是整个程序,所以说,无论在什么时候,只要是程序没有结束就可以访问。在任何时候对其修改都会对以后其它语句使用产生影响。其中如果是static修饰的局部变量,虽然它的生命周期是整个程序,但是它的作用域是申请它的那部分语句。

        常量区:程序结束后有操作系统进行释放和回收。存放字符常量和其他常量的地址。对于常量区应该注意,如果一个程序中有很多的函数,并且他们都申请了常量区的内存,并且他们的常量值相同,那么在编译器编译优化时候会对其进行优化,使各个函数使用相同的地址(常量值的地址)。

        堆区(heap):一般由程序员进行分配和释放,如果程序员没有释放,那么程序结束时可能(是可能)被操作系统进行释放回收。堆区的利用多是由程序员自己申请,想用多少就申请多少(在linux下以内存页的方式申请利用)。切记按习惯当使用完堆区申请的内存空间后要手动释放掉。这样不仅不会浪费计算机的内存,而且不容易出现意想不到的错误,还更利于逻辑分析。

        栈区(stack):有编译器自动分配和释放。存放函数的参数值,局部变量的值等。栈的结构想必都清楚,简单一句话:先进后出,后进先出。在这里要注意的是,在很多个调用函数被调用时,先调用的函数的参数和变量先入栈,而后被调用的函数后入栈,也就是形成了函数的调用嵌套,而后调用的函数要先结束,先调用的函数后结束,依旧是因为栈区的内的函数的参数和变量的先后顺序决定的。所以说函数的调用的关系与内存的分区中栈区的性质有直接关系。

    *****充分理解了各个分区对内存的申请和释放回收方式才能更好的理解的指针与变量之间的关系。

  四、关于指针:

     经典语句:指针指向谁就把谁的地址赋给指针。

    指针是一种数据类型,大小为4 byte,用来存储地址数据。

    格式: 数据类型 *  标识符; 例如 char * p;意思是:指向字符地址(或者字符串的首地址)的字符指针类型 的变量p(代表带下为4byte的内存块),既然p代表内存块,那么p也是代表一个地址 ,也可以用一个指针类型的变量来存储记录,这就是二级指针**pl。当然还有三级指针等等。

    指针经常用在被调用函数和调用函数之间的数据输入与输出(就是数据的交换)。如果用数组做函数是形参,会浪费内存,这是我们就可以用指针做函数的形式参数,来接收调用函数传来的实参地址,这样我们就可以大量的利用调用函数的数据了。同样,我们可以将被调用函数的内数据的地址赋值给指针,再将指针作为返回值返回给调用函数,这样调用函数就可以使用被调函数的大量数据。但要注意,对于函数返回值要及时用调用函数的变量保存起来,或者直接利用。因为被调用函数内申请的变量(无特殊情况)都是在栈区申请的,当被调用函数结束后就会被释放,导致数据丢失没有及时被利用的后果。


*******没有内存就没有首地址,没有首地址就没有指针。


*****不论是数据类型、或者变量 ,或是指针,从内存的分区来理解会更深刻。


以上只是我个人的理解,对于c语言和其它高级语言(如java)来比较,C语言更重于理解的过程,所以学习c语言一顶要在理解的基础上去应用,区搞项目。小弟我才疏学浅,写这些主要还是帮助自己深刻理解C,如果能帮到需要的人更是不胜荣幸。当然有说的不对之处还请大侠指教,不胜感激。


————————后期还会有这个方面的理解补充。-------————让坚持成为一种习惯,让懒惰成为一种奢侈。





LAMMPS实操系列(四): 高熵合金FCC-CoCrCuFeNi的退火模拟 我们对FCC-CoCrCuFeNi的退火模拟思路主要是,首先将材料以均匀的速率用100 ps从300 K升温至1000 K,然后在1000 K的温度下平衡100 ps,随后以均匀的速率用100 ps从1000 K降温至300 K,随后通过共轭梯度下降法做静力学结构优化得到退火后的结构。由于FCC-CoCrCuFeNi高熵合金被认为是潜在的工程结构材料[1],接下来我们将对退火前后的结构进行压缩模拟,对比退火前后FCC-CoCrCuFeNi高熵合金的力学性能变化,敬请各位读者关注我们的更新。 阅读详情

相关推荐

【vLLM-性能洞察】基于Ascend Profiler的端到端推理瓶颈定位与优化实践

本文详细介绍了如何利用Ascend Profiler对vLLM-Ascend大模型推理服务进行端到端的性能瓶颈定位与优化。通过实战案例,阐述了从数据采集、可视化分析到诊断低效算子、内存管理、计算通信重叠及框架调度等常见瓶颈的全过程,为基于昇腾NPU的AI推理性能调优提供了系统性的方法论和实用工具指南。

cc789的博客 526

判断CPU数据存储格式的类型

程序中采用两种方法来判断当前CPU的数据存储格式的类型:第一种方法是直接判断一个2字节的short整形变量1(0x0001)在内存中的存储方式,若是Little-Endian方式存储的,则内存低字节存放数据低位01,高字节存放数据高位00,所以只要判断低字节是否为1,若为1则为Little-Endian(小尾端)类型的CPU,反之则为Big-Endian 类型的CPU。 第二种方法用一

风行千里 1710

YT8531 PHY芯片硬件设计与MDIO/RGMII实战指南

以太网PHY芯片是FPGA系统实现网络通信的物理层核心,其关键在于标准接口(如MDIO管理总线和RGMII数据接口)的正确实现与协同。MDIO作为IEEE 802.3定义的低速配置通道,负责寄存器级控制与状态监控;RGMII则通过双沿采样精简引脚,在千兆速率下兼顾性能与PCB布线可行性。技术价值体现在电压兼容性(支持1.8V/2.5V/3.3V)、可编程时序调节(RX_DELAY/TX_DELAY)及多级环回测试能力,显著提升国产FPGA平台(如Xilinx Zynq)的工程鲁棒性。典型应用场景涵盖嵌入式网

weixin_42453228的博客 1337

检测数据类型的四种方式

文章目录一、浅谈js运行机制1、思考下列代码在js中用来检测数据类型的四种方式typeof 运算符 详解 提示:以下是本篇文章正文内容,下面案例可供参考 一、浅谈js运行机制 浏览器加载页面,运行代码的时候: ● 每打开一个页面,就会从计算机的内存条中分配出两块内存:堆内存(heap)和栈内存(stack) ● 堆内存(heap): ○ 主要存放引用数据类型的值 ● 栈内存(stack): ○ 给代码提供可执行的环境 ○ 存贮基本数据类型的值 1、思考下列代码 代码如下(示例): var a=12; va

wxh2860906464的博客 252

CoppeliaSim远程API实战:用Python控制仿真机器人,5步搞定外部通信

本文详细介绍了如何使用Python通过CoppeliaSim远程API控制仿真机器人,实现外部通信的5个关键步骤。从环境配置到双向通信模式,再到实战案例和性能优化技巧,帮助开发者高效连接算法开发与物理验证。特别对比了B0与传统API的性能差异,提升工业自动化项目的开发效率。

weixin_28733637的博客 369

HFSS简要教程--无线能量传输线圈仿真

关于无限能量传输线圈仿真简要教程

asdmoon18的博客 2548

指针变量、普通变量、内存和地址的全面对比

本篇文章,将提到4个概念: 1、普通变量 2、指针变量 3、内存(内存空间) 4、地址 我们先看内存是什么?内存是实实在在的硬件,可以存放数据!在我们的一块可编程的芯片的内部有大把的内存。 形象一点,内存就像一个个的小格子,每个格子的大小是一个字节,可以存放一个字节的数据。 那这么多内存如何区分呢?那就得靠地址。地址是内存的标识,每一个地址都对应一个内存。所以内存和地址是一...

405

把复杂计算推到数据库里:ABAP CDS View Table Function 从原理到落地实践

摘要:本文深入解析ABAP CDS Table Function技术,重点探讨其在复杂业务场景下的应用价值。当CDS View无法满足窗口函数、递归计算等高级需求时,Table Function通过结合CDS类型系统与AMDP的数据库原生计算能力,成为关键解决方案。文章详细介绍了Table Function的架构设计(CDS实体声明+AMDP实现)、客户端处理机制、开发传输流程中的注意事项,并通过航班数据示例展示最小实现闭环。这项技术特别适用于需要将复杂计算下推到数据库层的场景,能显著提升RAP和OData

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

linux swap分区与内存,虚拟内存和swap分区的关系

首先,这两个概念分别对应windows和linux,即:windows:虚拟内存linux:swap分区windows即使物理内存没有用完也会去用到虚拟内存,而Linux不一样 Linux只有当物理内存用完的时候才会去动用虚拟内存(即swap分区)swap类似于windows的虚拟内存,不同之处在于,Windows可以设置在windows的任何盘符下面,默认是在C盘,可以和系统文件放在一个分区里。...

weixin_26729841的博客 2082

【原理图PCB专题】原理图图纸锁定/解锁与PCB文件加密方式

在工作中我们会遇到需要冻结原理图进行评审和加密图纸防止被他人盗用的需求。那么在OrCAD Capture中如何对图纸进行锁定与解锁,如何在Allegro中对PCB工程进行加密呢?

一点硬件 3256

下载MNIST数据集并使用python将数据转换成NumPy数组(源码解析)

下载MNIST数据集并使用python将数据转换成NumPy数组首先来分析init_mnist函数接下来继续分析load_mnist函数实现数据集转换的python脚本的代码显示MNIST图像并确认数据 下载MNIST数据集并将数据转换成NumPy数组的Python脚本里面最重要的就是load_mnist函数,其他项目想要调用数据集的话,就可以调用load_mnist函数,得到一个字典类型的数据,字典的值是一个Numpy数组。 这些过程是如何实现的,现在开始逐字逐句分析源码: 在load_mnist函数中第

及时总结 4268

数据类型及内存理解

数据类型及内存理解 在二进制形式上可能数据结构:内存中的数据永远是二进制,只是系统读取方式不同 1、数据类型 常用的数据类型(C语言):char、short、int、long、long long、float、double,分为-整形和浮点型。整形:(unsigned) char、(unsigned) short、(unsigned) int、(unsigned) long;浮点型:float、d...

YiWei2019的博客 426

[Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

分类(Classification)属于有监督学习(Supervised Learning)中的一类,它是数据挖掘、机器学习和数据科学中一个重要的研究领域。分类模型类似于人类学习的方式,通过对历史数据或训练集的学习得到一个目标函数,再用该目标函数预测新数据集的未知属性。本章主要讲述分类算法基础概念,并结合决策树、KNN、SVM分类算法案例分析各类数据集,从而让读者学会使用Python分类算法分析自己的数据集,研究自己领域的知识,从而创造价值。 19.1 分类 19.1.1 分类模型 与前面讲述的聚类模型类似

杨秀璋的专栏 2万+

从计算机角度理解C语言指针(二)

这一篇博文我们给内存分一下区。有同学会说,听说过给硬盘分区的没听过给内存分区的。其实,学习过Linux内核的同学肯定看到过有关页表的内容。这些讲起来太复杂还有什么虚拟内存等等内容更是无法理解,但是这些都不影响我们给内存分区。 话说内存也不是什么神秘的东西,我感觉它就跟我们小学用的方格本差不多。唯一的区别就是我们这个方格本每一行都有32个格子,每个格子里只能放0或1。 于是我们的程序就将这个叫内存的...

难波儿万的博客 317

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C语言中如何理解内存分区

在C语言中,内存是程序运行的基础。为了更好地理解和使用C语言,了解内存分区的方式和特点是必要的。本文将分别从不同的角度来探讨C语言中的内存分区,并辅以具体的代码示例进行分析。

weixin_44205236的博客 110

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

从一段小代码理解C语言指针

指针可以说是C语言中最核心的概念之一,也是C语言如此强大的原因所在。在透彻理解指针的基础上,对语法结构、数据类型和计算机基础知识稍加了解,便可以写出强大的C语言程序来。不过指针的重要性也决定了它的难学,不少新手在入门C语言时,往往都卡在指针处痛苦不堪,甚至萌生退意。我最初是从python入门,然后学了java,这些高级语言最大的特点就是高效简洁,但是由于与底层相去甚远,所以常常有种“...

KageYamaa的博客 1432

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

大学生版保姆式学《C和指针》——C程序的内存布局

这一章我们深入C程序的“底层骨架”——运行时内存布局

ZhongWeiXiang9的博客 639

内存分区那些事

在c++中,内存分成五个区:

spencerzou的专栏 779

C语言指针进阶笔记

一、指针与二维数组 两种角度看待二维数组 (1)从一维数组角度 #include <stdio.h> int main() { int a[3][4]; int *p=&a[0][0]; int i,j; for( i=0; i<3; i++ ) for( j=0; j<4; j++ ) *(p++)=i+j;//赋值以后,p++,向后移 } (2)从二维数组角度 int a[3]..

uu_77的博客 877

C语言底层操作:从内存对齐到指针运算,掌握系统编程核心

在系统软件、嵌入式和高性能计算领域,理解计算机底层运作机制是开发者必备的核心能力。从内存模型、指针运算到编译链接过程,这些基础概念构成了程序与硬件交互的桥梁。掌握内存对齐原则能优化数据访问速度,理解指针本质可避免野指针和内存越界问题,而熟悉字节序和系统调用则确保了跨平台数据处理的正确性。这些底层知识不仅是写出高性能、高可靠代码的基石,更是面试中考察候选人技术深度的关键。通过剖析memcpy与memmove的区别、结构体内存布局等实际案例,开发者能建立起从现象到本质的分析框架,从而在工程实践中有效应对栈溢出、

weixin_29597551的博客 333

C++ 内存分区实战:从代码区到堆区的深度解析与应用

本文深度解析C++程序运行时的四大内存分区:代码区、全局区、栈区和堆区。通过实战代码演示,详细阐述了各区域的生命周期、管理方式与核心特性,并重点剖析了栈区返回局部变量地址的经典错误及堆区内存泄漏的规避方法,旨在帮助开发者建立清晰的内存布局认知,编写出更高效、健壮的C++程序。

data3的博客 460

JVM内存模型的理解

本文来自《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》 一、运行时的数据区域 Java虚拟机会在运行时将内存划分为若干个不同的区域,这些区域有各自的用途,创建和销毁时间。 下面就分开说说这几个区域的具体内容。 1.1 程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器。在Java虚拟机概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分.

学而不思则忘 484

10_C++内存分区与动态内存管理

本文介绍了C++程序的内存分区及其管理方式。程序运行时内存被划分为代码区(存放只读指令)、全局区(存放全局/静态变量)、栈区(自动管理的函数局部变量)和堆区(动态分配的内存)。全局区和代码区在程序加载时创建,栈和堆在运行时动态变化。栈由编译器自动管理,效率高但容量有限;堆需手动管理,容量大但可能产生内存泄漏。文章通过代码示例展示了不同类型变量的内存地址分布,并强调不能返回局部变量地址。理解内存分区对编写高效、安全的C++代码至关重要。

qq_53586017的博客 186

技术演进中的开发沉思-14 window编程系列:内存体系结构(上)

本文探讨了Windows内存管理机制的发展与架构。作者对比了早期需要手动管理内存的编程方式与现代自动内存回收的差异,重点解析了Windows进程的虚拟地址空间结构。文章将虚拟内存空间比作"数字王国",划分为空指针禁区、用户模式分区等不同功能区域,并通过C++代码示例展示了变量在内存中的分配原理。最后指出Windows通过虚拟地址映射物理存储器的机制,以及内存管理算法的重要性,为后续深入探讨内存体系埋下伏笔。

你的天空阅读专栏 1077

从内存分配、存储类型理解内存管理

文章从程序运行的角度详细的分析了系统的内存管理,包括对数据存储类型和在编译阶段的链接属性的解释。

赶路人的博客 460

CC++八股文之内存

本文深入探讨了C/C++中的内存管理核心概念。首先阐述了内存本质,指出内存作为连续字节数组的特性,以及地址空间和字节序等关键概念。接着详细分析了程序内存分区,包括代码区、全局/静态存储区、栈区、堆区和常量区的特点及作用。随后对比了指针与引用的区别,并解析了值传递、引用传递和指针传递三种参数传递方式的异同。最后介绍了C++特有的RAII(资源获取即初始化)技术,强调通过对象生命周期管理资源的重要性。这些基础知识对于理解C/C++内存机制和编写高效安全代码至关重要。

梅花香自苦寒来,宝剑锋从磨砺出。 1071
上一篇: 关于C语言中数据类型的转化方式
下一篇: 对指针的初步理解
蚂蚁de臂膀
博客等级 码龄12年 21粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值