本文全面概括了变量:什么是变量,如何定义变量,变量的本质:生命周期作用域,什么是常量,一一列举各种常量,对变量和常量有个初步全面的认识,为后面学习编程打好基础…

字面意思:变化的量 从字面上看就是一个会变化的量
作用:定义创建一个变量即在内存中申请一段内存空间,用来存放数据 。
int age = 18;
char ch = ‘a’;
类型 变量名 = 默认值(创建变量时给变量里初始化的值)
小知识:标识符都可以作为变量名,但变量名的取名应尽可能有意义,比如 变量名age 表示年龄 读这段代码就能让人明白这个变量里面存的是年龄
计算机是为了解决人计算能力不足的问题而诞生的。
即,计算机是为了进行计算的。 而计算,就需要数据。
而要计算,任何一个时刻,不是所有的数据都要立马被计算。
如同:要吃饭,不是所有的饭菜都要立马被你吃掉。饭要一口一口吃,那么你还没有吃到的饭菜,就需要暂时放在盘子里。
这里的盘子,就如同变量,饭菜如同变量里面的数据。 换句话说,为何需要变量?因为有数据需要暂时被保存起来,等待后续处理。
那么,为什么吃饭要盘子?我想吃一口菜了,直接去锅里找不行吗?当然行,但是效率低。 因为我们吃饭的地方,和做饭的地方,是比较"远"的。
1.一个程序运行,需要加载到内存中
2.程序计算,会需要使用变量那么,定义变量的本质:在内存中开辟一块空间,用来保存数据。
(为何一定是内存:因为定义变量,也是程序逻辑的一部分,程序已经被加载到内存)
作用域指该变量能被正常访问的代码区域
变量又分全局变量、局部变量
能被正常访问的代码区域为整个程序文件,严格来讲是实际定义这个全局变量的位置到整个程序文件结束间这个范围,
光看文字不理解,现在上一段代码↓
#include
int g_x = 100; //全局变量 作用域从这里开始 先将g_x初始化为100
void show()
{
printf("show: 全局: %d\n", g_x); //在任何代码块中都可以被访问
}
int main()
{
show();
printf("main: 全局: %d\n", g_x); //在任何代码块中都可以被访问,甚至被修改
return 0;
} //作用域到这里结束
g_x为全局变量 ,在其下main 函数 和show函数 里都能对其访问 甚至被修改。
能被正常访问的代码区域在其所在的局部范围内,严格来讲是在这局部范围内定义这个变量开始到这个局部范围结束,作用域在这个区间。老样子,上代码↓
#include
int main()
{
int x = 10; //定义一个局部变量 x
if (x == 10)
{
int y = 20; // 定义一个局部变量 y
printf("局部: x: %d, y: %d\n", x, y);//y只能在本代码块内有效
}
printf("局部: x: %d, y: %d\n", x, y); //报错,y不能被访问
return 0;
}
x是一个局部变量 ,它所在的作用域 为 整个main函数里 (实际定义x变量处到main函数结束),y也为局部变量,但它的作用域为最里面的那个代码块里(代码块即为{ }
花括号括起来的区域) 在y所在的代码块里可以打印x和y变量的内容,
但在其代码块外只能打印x的内容而y会报错,因为在x代码块外
不能访问x变量。
此时程序无法运行
.
生命周期概念:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间”被释放“。
当程序开始执行时,会先查找是否存在全局变量的定义,如果有,则直接为全局变量申请开辟相应的空间,此时生命周期开始
在整个程序结束以后,申请开辟的空间才会还给操作系统,此时生命周期结束
#include
int n;
int main()//这串代码的全局变量生命周期 空间开辟是怎样进行的呢?输出结果又是什么?
{
printf("%d", n);
return 0;
}

当一执行程序时,语句就到了int main()函数这里,而此时 n变量已经申请开辟了,并且里面的值为0
表示全局变量在程序执行时就会为其申请开辟一段内存空间,也就是生命周期开始,只有在整个程序结束后,变量才会销毁,而因为全局变量的特性:全局变量未初始化默认就为0
所以在main函数里访问全局变量时,n的值也是为0,但可以在实际定义变量n开始到整个程序结束这个范围内通过赋值语句更改全局变量n里的值.
局部变量生命周期在进局部变量所在的代码块内时,会直接给代码块内的局部变量申请开辟一块对应的内存空间,即生命周期开始,直到出代码块这个局部范围时,为局部变量申请的内存空间还给操作系统,此时生命周期结束.
#include
int main() //这串代码的局部变量生命周期 空间开辟是怎样进行的呢?输出结果又是什么?
{
printf("********\n");
int i = 2;
{
printf("*********\n");
int a = 3;
int i = 3;
printf("%d %d", i, a);
}
printf("%d", i);
return 0;
}
分析上面代码:在main函数里有两个代码块,也就是两个局部范围,main函数所在的大的局部范围里面有一段小的局部范围 两个局部范围有着不同的意义

当进入大的代码块时,可以通过调试看到此时并没有运行到int i=2;这条语句,但是监视窗口此时已经显示为i变量申请开辟了内存空间但i里面还没有赋值为2,但是a变量并没有为其申请开辟内存空间.
说明进入代码块时,编译器会查询到当前代码块内的所有定义变量语句,并直接为其申请开辟对应的内存空间,此时代码块内的局部变量生命周期开始,但是并不能直接访问变量,只有在实际运行到变量定义的语句时,才是变量的作用域区间开始,此时将变量i初始化为2

而a变量虽然在大的代码块里,也在里面的一段小的局部范围里,此时a是属于这段小的局部范围,并且这段小的局部范围内也有整形变量i的定义,与上面的i变量二者会冲突吗? 并不会
从上面图可以看出:当运行到小的局部范围内时,会为当前小的局部范围内的变量定义申请开辟相对应的内存空间,此时生命周期开始,可以看到 此时a 和i都申请了一段内存空间,而a和i变量这段内存空间只有出这段小的局部范围时才会被释放,生命周期才会结束
但作用域在定义变量语句开始到局部范围结束这段区域,所以并没有给它们一进入局部范围就初始化而是只申请开辟了空间.

从上面图中可以看到:此时程序执行到了出小的局部范围后面的第一条语句
而对应的监视窗口中的内容由i变量里本身应该是3变成了2,而a变量也变成了淡黑区域
这说明上面的变量i和a的生命周期已经结束,此时是在大的局部范围内,而在大的局部范围内有一开始进大局部范围内变量i定义也就是也有一块i内存空间,此时是在大局部范围里变量i的作用域范围内且生命周期没有结束,i变量此时是2,而a变量是小局部范围内申请开辟的,此时出了小局部范围生命周期已经结束,说明这块a变量已经被释放给操作系统了,所以是淡黑色的表示无效

**总结:**在当前所处的局部范围内时,会为局部范围内所有定义变量申请开辟对应的内存空间,但是作用域是在实际变量定义时到局部范围结束这个区间
如果局部范围1内还有局部范围2,此时局部范围2里属于局部范围1的部分,但是内部有变量定义的话是独立于局部范围1之外的一段空间即局部范围1定义的i和局部范围2里定义的i不一样.
常量是指在整个操作过程中其值保持不变的数据,通常在命令或程序中直接给出其值,用于计算或某种特定用途
c语言中的常量分为以下几种:1.字面常量.2.const修饰的常变量,3.#define定义的符号常量
4.枚举常量,下面是一一的列举介绍,先做了解在以后学习过程中会慢慢遇到
字面意思上的常量,即数字1 为数字常量 字符 ‘a’ 为字符常量 字符串 "abc"为字符串常量
const 为一个关键字 ,它修饰的变量 表示该变量具有常属性,即变量里的值不能再被更改,但是本质其实还是一个变量 ,只是和常量类似,数据是只读不能更改的
#define为 预处理指令,其后面定义的的符号可以当做宏,也就是宏定义,定义的符号表达的内容写在符号后面,表示和后面的内容是同样的意义
上图#define 定义了NUM符号 内容为2,表示NUM和常量2是一个意思,此时打印NUM就是常量2.
枚举常量为自定义类型,所谓枚举就是一一列举,在自定义的类型里,列举一些可能出现的枚举常量,这些枚举常量在后面语句中都能使用,它们也就是常量
第一个枚举常量未初始化默认为0,后面的枚举常量未初始化为前面枚举常量加1

本文罗列介绍了变量的各种属性(生命周期和作用域等),和常量的属性已经一一举例了各种常量,刚开始初学,先全面的做个简单了解,后续会慢慢接触到这些知识,先对变量常量有个大概的认识,后面学习中会逐渐领悟…

写文不易,给个一键三连支持下吧~~~