17.数组那点事.md 4.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
## 数组的基本概念

- 数组,从字面上看,就是一组数据的意思,没错,数组就是用来存储一组数据的
  - 在C语言中,数组属于**构造数据类型**
- 数组的几个名词
  - 数组:一组`相同数据类型`数据的`有序`的集合
  - 数组元素: 构成数组的每一个数据。
  - 数组的下标: 数组元素位置的索引(从0开始)
- 数组的应用场景
  - 一个int类型的变量能保存一个人的年龄,如果想保存整个班的年龄呢?
    - 第一种方法是定义很多个int类型的变量来存储
    - 第二种方法是只需要定义一个int类型的数组来存储

```c
#include <stdio.h>

int main(int argc, const char * argv[]) {
    /*
    // 需求: 保存2个人的分数
    int score1 = 99;
    int score2 = 60;
    
    // 需求: 保存全班同学的分数(130人)
    int score3 = 78;
    int score4 = 68;
    ...
    int score130 = 88;
    */
    // 数组: 如果需要保存`一组``相同类型`的数据, 就可以定义一个数组来保存
    // 只要定义好一个数组, 数组内部会给每一块小的存储空间一个编号, 这个编号我们称之为 索引, 索引从0开始
    // 1.定义一个可以保存3个int类型的数组
    int scores[3];
    
    // 2.通过数组的下标往数组中存放数据
    scores[0] = 998;
    scores[1] = 123;
    scores[2] = 567;
   
    // 3.通过数组的下标从数组中取出存放的数据
    printf("%i\n", scores[0]);
    printf("%i\n", scores[1]);
    printf("%i\n", scores[2]);
    return 0;
}
```

------

## 定义数组

- 元素类型 数组名[元素个数];

```c
// int 元素类型
// ages 数组名称
// [10] 元素个数
int ages[10];
```

------

## 初始化数组

- **定义的同时初始化**
- 指定元素个数,完全初始化
  - 其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔

```c
int ages[3] = {4, 6, 9};
```

- 不指定元素个数,完全初始化
  - 根据大括号中的元素的个数来确定数组的元素个数

```c
int nums[] = {1,2,3,5,6};
```

- 指定元素个数,部分初始化
  - 没有显式初始化的元素,那么系统会自动将其初始化为0

```c
int nums[10] = {1,2};
```

- 指定元素个数,部分初始化

```c
int nums[5] = {[4] = 3,[1] = 2};
```

- 不指定元素个数,部分初始化

```c
int nums[] = {[4] = 3};
```

- **先定义后初始化**

```c
int nums[3];
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
```

- 没有初始化会怎样?
  - 如果定义数组后,没有初始化,数组中是有值的,是随机的垃圾数,所以如果想要正确使用数组应该要进行初始化。

```c
int nums[5];
printf("%d\n", nums[0]);
printf("%d\n", nums[1]);
printf("%d\n", nums[2]);
printf("%d\n", nums[3]);
printf("%d\n", nums[4]);
输出结果:
0
0
1606416312
0
1606416414
```

- 注意点:

- 使用数组时不能超出数组的索引范围使用, 索引从0开始, 到元素个数-1结束
- 使用数组时不要随意使用未初始化的元素, 有可能是一个随机值
- 对于数组来说, 只能在定义的同时初始化多个值, 不能先定义再初始化多个值

```c
int ages[3];
ages = {4, 6, 9}; // 报错
```

------

## 数组的使用

- 通过下标(索引)访问:

```c
// 找到下标为0的元素, 赋值为10
ages[0]=10;
// 取出下标为2的元素保存的值
int a = ages[2];
printf("a = %d", a);
```

------

## 数组的遍历

- 数组的遍历:遍历的意思就是有序地查看数组的每一个元素

```c
    int ages[4] = {19, 22, 33, 13};
    for (int i = 0; i < 4; i++) {
        printf("ages[%d] = %d\n", i, ages[i]);
    }
```

------

## 数组长度计算方法

- 因为数组在内存中占用的字节数取决于其存储的数据类型和数据的个数
  - 数组所占用存储空间 = 一个元素所占用存储空间 * 元素个数(数组长度)
- 所以计算数组长度可以使用如下方法
  数组的长度 = 数组占用的总字节数 / 数组元素占用的字节数

```c
    int ages[4] = {19, 22, 33, 13};
    int length =  sizeof(ages)/sizeof(int);
    printf("length = %d", length);
输出结果: 4
```

------

## 练习

- 正序输出(遍历)数组

```c
    int ages[4] = {19, 22, 33, 13};
    for (int i = 0; i < 4; i++) {
        printf("ages[%d] = %d\n", i, ages[i]);
    }
```

- 逆序输出(遍历)数组

```c
    int ages[4] = {19, 22, 33, 13};
    for (int i = 3; i >=0; i--) {
        printf("ages[%d] = %d\n", i, ages[i]);
    }
```

- 从键盘输入数组长度,构建一个数组,然后再通过for循环从键 盘接收数字给数组初始化。并使用for循环输出查看



最后,如果有任何疑问,请加微信 leader_fengy 拉你进学习交流群。

开源不易,码字不易,如果觉得有价值,欢迎分享支持。