C语言:从内存出发,理解变量

简介: C语言:从内存出发,理解变量

前言

C语言学习中,内存的运用是最重要的部分。不论是后续学习的指针,亦或者是动态内存管理都是离不开对内存的理解。拥有对内存的理解,不论在前期的基础学习或是在后期难题突破都有极大作用,在此我从内存的角度带大家理解数据类型与变量。

博客大纲

内存

什么是内存

内存指的并非一个计算机的储存容量,内存是一种用来存储临时数据的物理硬件,其最大特点就是直接与CPU交互,可以极快地把数据传给CPU,从而提高计算机的效率。而我们写代码的时候,比如int a= 10;这样一个代码,就是为a开辟一定大小的内存,并把10这个数据存入。

内存的分区

在人体中,有专门用于消化的肠胃,专门用于呼吸的肺,一个器官只干一类事情,可以极大提高生命活动的效率。

计算机的内存也是如此,由于内存需要传输的数据种类太多了,于是设计者将内存进行了分区,并为它们赋予专门的作用。

内存分为五大区,我们在C语言学习中最常用的就是:栈区,堆区,静态区。

栈区: 此区域用于存放一些并非整个程序都能使用的数据,即局部变量

静态区: 此区域用于存放一些整个程序都能使用的数据,即全局变量

堆区: 此区域用于动态内存管理,这是后续学习动态内存会使用到的区域,可以理解为,这块区域是易于程序员利用代码操控的。

接下来用一串代码来展示:

变量

什么是变量

变量代表一个有名字的、具有特定属性的一个存储单元,变量用来存放数据,也就是存放变量的值。

比如说int a = 10;从表面上来说,是创建一个名为a的数据,并为a赋值为10,

本质上来说,就是在内存中分出一块区域,把这个区域命名为a,然后往这个区域中存入数字10这个数据。

变量的生命周期

从刚刚变量的本质,可以发现变量就是一个用于存放数据的,有名字的内存块。那么一个变量能被创建,就能被销毁,一个变量从创建到销毁这个时间段,就是它的生命周期。

比如一个函数:

int Add(int x,int y)
{
  int num = x + y;
  return num;
}

这个Add函数中,有三个变量x,y,num。x和y是伴随着函数创建而一起创建的,当调用函数结束,x和y也会一起销毁。那么x和y的生命周期就是从这个Add函数的调用到Add函数执行结束。

而对于num,它是在函数调用后创建的变量,也就是说,num的生命周期是Add函数开始后一会,到Add函数执行结束。

我们再用一个图来理解:(注意,函数在调用的时候,内存会为整个函数分配一个空间,函数内部的所有局部变量都在这个分配的空间中),上方的红色框里的代码,指当前正在执行的代码。

从上图可以非常直观地感受到,一个变量的生命周期就是这个变量从内存为其分配空间到其空间的释放。

变量的作用域

变量的作用域就是指这个变量在什么区域可以使用,有不少人认为:变量的生命周期和作用域是一样的。这是一个完全错误的观点。局部变量的作用域一般是创建这个变量到变量所在的函数结束,而全局变量的作用域是:整个程序减去有同名局部变量的函数内部的区域。接下来我们一一解释两种变量的作用域。

局部变量的作用域

局部变量的作用域是创建这个变量到变量所在的函数结束

我们有如下代码:

int Add(int x,int y)
{
  int num = x + y;
  return num;
}
int main()
{
  int a = 1;;
  int b = 2;
  Add(a, b);
}

请问a,b,x,y,num的作用域是什么?

我们靠图片分析:

在图片1中:

a和b是在下方绿色区块的main函数内创建的,那么a和b的作用域就是这个main函数内。那main函数调用了Add函数,Add函数内部是不是a和b的作用域呢?

要回答上述问题,不妨先回答:在Add函数内能不能完成int num = a + b;很明显是不行的,也就是说,a和b这两个变量,是无法在Add函数内使用,那么Add函数内部也就不是a和b的作用域了。

对x和y来说,它们是伴随Add函数创建的,它们的作用域就是这个Add函数内部,当这个Add函数调用结束,我们就不能使用这里的x和y了。对于num来说,它的创建略晚于a和b,所以它的作用域就是从num创建到这个Add调用结束。

接下来我们转到图片2:

相比于图片1,图片2我们在main函数内创建了x,y,然后调用Add函数,Add函数又创建了x,y。这里出现了同名的变量,请问最后完成的是1+2还是3+4?

这就涉及到了同名变量的问题。当一个函数内创建的变量与外部创建的变量重名时,优先使用函数内创建的变量。

又图1的分析,我们知道,a,b的作用域并不包括Add函数内,在这也是一样的,main函数内创建的x和y只能供main函数使用,Add函数创建的x,y也只能供Add函数使用,最后函数完成的是传入的a和b的加法,即1+2。

图片分析:

上图中,我用蓝色与绿色的框区分了两个函数内的x与y。这就像在地球上有很多人叫做张三,但是当一个老师在班上点名让张三回答问题时,点的一定是班上那个叫做张三的人。

全局变量的作用域

全局变量的作用域情况和刚刚讨论的重名问题十分相似,也就是说,我们定义一个全局变量后在后续任然可以用这个变量来命名新的变量。但是在命名新变量的函数中,原先的

以以下代码为例:

int x = 5;
int y = 6;
int main()
{
  printf("%d\n", (x + y));
  int x = 3;
  int y = 4;
  printf("%d\n", (x + y));
}

此代码中,我们正在函数外部定义了x和y,又在main函数内定义了x和y。

提问:main函数中两个printf的输出结果分别是什么?

又上图可知,第一次printf时,新的xy还没有创建,使用的就是全局变量xy。第二次printf时,由于main函数内创建了新的xy,那么printf使用的就是局部变量xy。

那么全局变量xy的作用域是什么?

从上述分析得出,全局变量在局部的xy创建时就暂时停止了,那我们画张图来表示下它们作用域

可以用非常明显的看到,并非生命周期和作用域是完全重合的。

相关文章
|
16天前
|
存储 编译器 C语言
初识C语言:注释、关键字、常量、变量
按照要求输出以下内容: 1,我学校的名字为:XXXXX 要求:学校的名字需要结合占位符的形式进行输出 2,我高考的总分为:XXX分 要求:处理网总分需要结合占位符的形式进行输出 3,我亲亲女朋友的名字是:XXX 要求:女朋友的名字需要结合占位符的形式进行输出
|
4月前
|
存储 人工智能 程序员
一文彻底搞清楚C语言的数据类型和变量
本文介绍了数据类型(基本、构造、指针、空类型)、变量(使用、命名规则、作用域)和常量(字面、符号、枚举、表达式),帮助初学者理解编程基础概念。坚持学习,定能创造奇迹!
462 1
一文彻底搞清楚C语言的数据类型和变量
|
6月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
157 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
6月前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
157 12
|
6月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
196 6
|
6月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
91 5
|
7月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
172 6
|
7月前
|
大数据 C语言
C 语言动态内存分配 —— 灵活掌控内存资源
C语言动态内存分配使程序在运行时灵活管理内存资源,通过malloc、calloc、realloc和free等函数实现内存的申请与释放,提高内存使用效率,适应不同应用场景需求。
|
7月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
7月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
162 1