## 什么是变量? - "量"表示数据。变量,则表示一些不固定的数据,也就是可以改变的数据 - 就好比现实生活中人的身高、体重一样, 随着年龄的增长会不断发生改变, 所以身高、体重就是现实生活中变量的一种体现 - 就好比现实生活中超市的储物格一样, 同一个格子在不同时期不同人使用,格子中存储的物品是可以变化的。张三使用这个格子的时候里面放的可能是尿不湿, 但是李四使用这个格子的时候里面放的可能是面包 --- ## 如何定义变量 - 格式1: 变量类型 变量名称 ; + 为什么要定义变量? + 任何变量在使用之前,必须先进行定义, 只有定义了变量才会分配存储空间, 才有空间存储数据 + 为什么要限定类型? + 用来约束变量所存放数据的类型。一旦给变量指明了类型,那么这个变量就只能存储这种类型的数据 + 内存空间极其有限,不同类型的变量占用不同大小的存储空间 + 为什么要指定变量名称? + 存储数据的空间对于我们没有任何意义, 我们需要的是空间中存储的值 + 只有有了名称, 我们才能获取到空间中的值 ```c int a; float b; char ch; ``` - 格式2:变量类型 变量名称,变量名称; + 连续定义, 多个变量之间用逗号(,)号隔开 ```c int a,b,c; ``` - 变量名的命名的规范 + 变量名属于标识符,所以必须严格遵守标识符的命名原则 --- ## 如何使用变量? - 可以利用=号往变量里面存储数据 + 在C语言中,利用=号往变量里面存储数据, 我们称之为给变量赋值 ```c int value; value = 998; // 赋值 ``` - 注意: + 这里的=号,并不是数学中的“相等”,而是C语言中的***赋值运算符***,作用是将右边的整型常量998赋值给左边的整型变量value + 赋值的时候,= 号的左侧必须是变量 (10=b,错误) + 为了方便阅读代码, 习惯在 = 的两侧 各加上一个 空格 --- ## 变量的初始化 - C语言中, 变量的第一次赋值,我们称为“初始化” - 初始化的两种形式 + 先定义,后初始化 + ```int value; value = 998; // 初始化``` + 定义时同时初始化 + ```int a = 10; int b = 4, c = 2;``` + 其它表现形式(不推荐) ```c int a, b = 10; //部分初始化 int c, d, e; c = d = e =0; ``` - 不初始化里面存储什么? + 随机数 + 上次程序分配的存储空间,存数一些 内容,“垃圾” + 系统正在用的一些数据 --- ## 如何修改变量值? - 多次赋值即可 + 每次赋值都会覆盖原来的值 ```c int i = 10; i = 20; // 修改变量的值 ``` --- ## 变量之间的值传递 - 可以将一个变量存储的值赋值给另一个变量 ```c int a = 10; int b = a; // 相当于把a中存储的10拷贝了一份给b ``` --- ## 如何查看变量的值? - 使用printf输出一个或多个变量的值 ```c int a = 10, c = 11; printf("a=%d, c=%d", a, c); ``` - 输出其它类型变量的值 ```c double height = 1.75; char blood = 'A'; printf("height=%.2f, 血型是%c", height, blood); ``` --- ## 变量的作用域 - C语言中所有变量都有自己的作用域 - 变量定义的位置不同,其作用域也不同 - 按照作用域的范围可分为两种, 即局部变量和全局变量 --- - 局部变量 + 局部变量也称为内部变量 + 局部变量是在***代码块内***定义的, 其作用域仅限于代码块内, 离开该代码块后无法使用 ```c int main(){ int i = 998; // 作用域开始 return 0;// 作用域结束 } ``` ```c int main(){ { int i = 998; // 作用域开始 }// 作用域结束 printf("i = %d\n", i); // 不能使用 return 0; } ``` ```c int main(){ { { int i = 998;// 作用域开始 }// 作用域结束 printf("i = %d\n", i); // 不能使用 } return 0; } ``` --- - 全局变量 + 全局变量也称为外部变量,它是在代码块外部定义的变量 ```c int i = 666; int main(){ printf("i = %d\n", i); // 可以使用 return 0; }// 作用域结束 int call(){ printf("i = %d\n", i); // 可以使用 return 0; } ``` --- - 注意点: + 同一作用域范围内不能有相同名称的变量 ```c int main(){ int i = 998; // 作用域开始 int i = 666; // 报错, 重复定义 return 0; }// 作用域结束 ``` ```c int i = 666; int i = 998; // 报错, 重复定义 int main(){ return 0; } ``` + 不同作用域范围内可以有相同名称的变量 ```c int i = 666; int main(){ int i = 998; // 不会报错 return 0; } ``` ```c int main(){ int i = 998; // 不会报错 return 0; } int call(){ int i = 666; // 不会报错 return 0; } ``` --- ## 变量内存分析(简单版) - 字节和地址 + 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址” + **每一个小格子代表一个字节** + **每个字节都有自己的内存地址** + **内存地址是连续的** ![](https://img-blog.csdnimg.cn/img_convert/5515a7f3bbb5194db1f67b4f98de31c5.png) - 变量存储占用的空间 - 一个变量所占用的存储空间,和***定义变量时声明的类型***以及***当前编译环境***有关 | 类型 | 16位编译器 | 32位编译器 | 64位编译器 | | --------- | ---------- | ---------- | ---------- | | char | 1 | 1 | 1 | | int | 2 | 4 | 4 | | float | 4 | 4 | 4 | | double | 8 | 8 | 8 | | short | 2 | 2 | 2 | | long | 4 | 4 | 8 | | long long | 8 | 8 | 8 | | void* | 2 | 4 | 8 | - 变量存储的过程 + 根据定义变量时声明的类型和当前编译环境确定需要开辟多大存储空间 + 在内存中开辟一块存储空间,开辟时从内存地址大的开始开辟(内存寻址从大到小) + 将数据保存到已经开辟好的对应内存空间中 ```c int main(){ int number; int value; number = 22; value = 666; } ``` ```c #include int main(){ int number; int value; number = 22; value = 666; printf("&number = %p\n", &number); // 0060FEAC printf("&value = %p\n", &value); // 0060FEA8 } ``` ![](https://img-blog.csdnimg.cn/img_convert/3ac2c92b7d317d38441f3948865d98d0.png) > 先不要着急, 刚开始接触C语言, 我先了解这么多就够了. 后面会再次更深入的讲解存储的各种细节。 最后,如果你有任何疑问,加微信 **leader_fengy** 拉你进学习交流群