27.C语言变量那点事.md 6.7 KB
Newer Older
极客江南's avatar
极客江南 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
## 什么是变量?

- "量"表示数据。变量,则表示一些不固定的数据,也就是可以改变的数据
- 就好比现实生活中人的身高、体重一样, 随着年龄的增长会不断发生改变, 所以身高、体重就是现实生活中变量的一种体现
- 就好比现实生活中超市的储物格一样, 同一个格子在不同时期不同人使用,格子中存储的物品是可以变化的。张三使用这个格子的时候里面放的可能是尿不湿, 但是李四使用这个格子的时候里面放的可能是面包

---

## 如何定义变量

- 格式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 <stdio.h>
  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** 拉你进学习交流群