# 變量基本概念
## 什么是變量
- 表示的數據是可以經常修改的。當一個數據的值需要經常改變或者不確定時,就應該用變量來表示。
+ 例如:游戲積分
+ 變量分為全局變量,局部變量。全局變量定義在函數外部,程序開始到結束都一直在,而局部變量定義在函數內部,只能供函數使用,在函數內部有效
## 如何定義變量
- 定義變量(聲明), 任何變量在使用之前,必須先進行定義。
- 定義變量的目:在內存中分配一塊存儲空間給變量,方便以后存儲數據。
- 如果定義了多個變量,就會為這多個變量分別分配不同的存儲空間。
+ **格式1: 變量類型 變量名稱 **
```
int a;
float b;
char ch;
```
+ **格式2:變量類型 變量名稱,變量名稱**
+ 連續定義, 多個變量之間用逗號(,)號隔開
```
int a,b;
int a,b,c,d;
```
>+ 不同類型的變量占用不同大小的存儲空間。內存極其有限,分配適當的存儲空間
- 變量明的命名的規范
- 變量名屬于標識符,所以必須嚴格遵守標識符的命名原則
- 變量名要盡可能的望文知意、簡潔
## 變量初始化和引用
### 如何使用變量
- 賦值就是往變量里面存點東西,就是賦值。賦值語句后帶個分號;
```
int value;
value = 998; // 賦值
```
>+ 注意:這里的等號=,并不是數學中的“相等”,而是C語言中的賦值運算符,作用是將右邊的常量998賦值給左邊的變量value
>+ 賦值的時候,= 號的左側必須是變量 (10=b,錯)
>+ (2)規范:習慣將 = 的兩側 各加上一個 空格
### 變量的初始化
- 變量第一次賦值,可以稱為“初始化”
- 初始化的兩種形式
+ 先定義,后初始化
```
int value;
value = 998; // 初始化
```
+ 定義的同時進行初始化
```
int a = 10; // 完全初始化
int a, b=10; //部分初始化
int a=4, b=2;
```
+ 其它表現形式
* 批量初始化
```
int a,b,c;
a = b = c =0;
```
+ 思考: 不初始化里面存儲什么?
```
int a; //不會報錯,a里面存的內容:
1)隨機數
2)上次程序分配的存儲空間,存數一些 內容,“垃圾”
3)系統正在用的一些數據
```
### 如何修改變量值
- 可以修改變量的值,多次賦值。每次賦值都會覆蓋原來的值
```
int i = 10;
i = 20; // 修改變量值
```
### 變量之間的值傳遞
- 可以將一個變量的值賦值給另一個變量
```
int a = 10;
int b = a;
```
- 連續賦值
```
int a,b,c;
a = b = c = 0;
```
---
### 如何查看變量的值
- 使用`printf`輸出一個/多個變量的值
```
int a = 10, c = 11;
printf("a=%d, c=%d", a, c);
```
- double\float\char的輸出,格式符的一些小技巧
```
double height = 1.75;
char blood = 'A';
printf("height=%.2f, 血型是%c", height, blood);
```
## 變量的作用域
### 變量的作用域
C語言中所有變量都有自己的作用域,申明變量的類型不同,其作用域也不同。C語言中的變 量,按照作用域的范圍可分為兩種, 即局部變量和全局變量。
### 局部變量
局部變量也稱為內部變量。局部變量是在函數內作定義說明的。其作用域僅限于函數內(代碼塊), 離開該 函數后再使用這種變量是非法的。
+ 例如:
```
int main(){
int i = 998; // 作用域開始
return 0;
}// 作用域結束
```
```
int main(){
{
int i = 998; // 作用域開始
}// 作用域結束
return 0;
}
```
```
int main(){
{
{
int i = 998;// 作用域開始
}// 作用域結束
}
return 0;
}
```
- 作用域補充說明(了解):
+ 主函數中定義的變量也只能在主函數中使用,不能在其它函數中使用。同時,主函數中 也不能使用其它函數中定義的變量。因為主函數也是一個函數,它與其它函數是平行關系。
+ 形參變量是屬于被調函數的局部變量,實參變量是屬于主調函數的局部變量。
+ 允許在不同的函數中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不 干擾,也不會發生混淆。雖然允許在不同的函數中使用相同的變量名,但是為了使程序明了易 懂,不??倡在不同的函數中使用相同的變量名。
### 全局變量
- 全局變量也稱為外部變量,它是在函數外部定義的變量。
### 常見錯誤
- 變量名相同 int a = 10; int a = 12;
- 變量的作用域不對
- 變量的創建和釋放過程
- 代碼塊作用域 { int a = 10; }
## 變量內存分析
### 字節和地址
- 為了更好地理解變量在內存中的存儲細節,先來認識一下內存中的“字節”和“地址”。
- 內存以“字節為單位”
### 變量的存儲
- 一個變量所占用的存儲空間,不僅跟變量類型有關,而且還跟編譯器環境有關系。同一種類型的變量,在不同編譯器環境下所占用的存儲空間又是不一樣的
+ 所占用字節數跟類型有關,也跟編譯器環境有關
+ **內存由大到小尋址**
+ 變量存儲單元的第一個字節的地址就是該變量的地址
+ 任何變量在內存中都是以二進制的形式存儲。一個負數的二進制形式,其實就是對它的正數的二進制形式進行取反后再+1。(取反的意思就是0變1、1變0)
|類型|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|
- 內存尋址示例
```
#include <stdio.h>
int main(int argc, const char * argv[]) {
// 內存尋址從大到小,如果按照這種規則,那么先定義的遍歷內存地址一定大于后定義的變量
int number = 0;
int value = 0;
// 獲得變量的詳細地址(變量地址,16進制)'&變量名'
printf("%p\n",&number); // 0x7fff5fbff6ec
printf("%p\n",&value); // 0x7fff5fbff6e8
return 0;
}
```
### 取值范圍
- 不同數據類型所占的存儲空間是不一樣的,字節長度不一樣,包含的二進制位數就不一樣,能表示的數據范圍也就不一樣
- 如果賦值的時候超出了變量的取值范圍,那么將損失精度,得到“垃圾數據”(“垃圾數據”就是指并非我們想要的數據)
|關鍵字|所占字節數|表示范圍|
|--|--|--|--|
|int|4|-2(31) ~ 2(31)-1|
|signed short int|2|-2(15) ~ 2(15)-1|
|signed long int|4|-2(31) ~ 2(31)-1|
|unsigned int|4|0 ~ 2(32)-1|
|unsigned short int|2|0 ~ 2(16)-1|
|unsigned long int|4|0 ~ 2(32)-1|
|float|4|絕對值E-37 ~ E+38|
|double|8|絕對值E-307 ~ E+308|