一、认识数组

数组的几个名词:

  • 数组: 一组相同数据类型数据的有序的集合
  • 数组元素: 构成数组的每一个数据
  • 数组的下标: 数组元素位置的索引(从0开始)

只要定义好一个数组, 数组内部会给每一块小的存储空间一个编号, 这个编号我们称之为 索引, 索引从0开始。

比如,用数组保存三个人的分数:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 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;

1. 定义数组

元素类型 数组名[元素个数];
1
2
3
4
int ages[10];
// int 元素类型
// ages 数组名称
// [10] 元素个数

2. 初始化数组

C语言中的数组初始化是有多种方式:

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

    1
    int ages[3] = {4, 6, 9};
  • 不指定元素个数,完全初始化
    根据{ }中的元素的个数来确定数组的元素个数

    1
    int nums[] = {1,2,3,5,6};
  • 指定元素个数,部分初始化
    没有显式初始化的元素,那么系统会自动将其初始化为0

    1
    int nums[10] = {1,2};
  • 不指定元素个数,部分初始化

    1
    int nums[] = {[4] = 3};
  • 先定义后初始化

    1
    2
    3
    4
    int nums[3];
    nums[0] = 1;
    nums[1] = 2;
    nums[2] = 3;

没有初始化会怎样?
如果定义数组后,没有初始化,数组中是有值的,是随机的垃圾数:

1
2
3
4
5
6
7
8
9
10
11
12
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

所以如果想要正确使用数组,应该要进行初始化,也就是说要给它值。

注意:

  1. 使用数组时不能超出数组的索引范围使用, 索引从“0”开始, 到“元素个数-1”结束
  2. 使用数组时不要随意使用未初始化的元素, 有可能是一个随机值
  3. 对于数组来说, 只能在定义的同时初始化多个值, 不能先定义再初始化多个值:
1
2
int ages[3];
ages = {4, 6, 9}; // 报错

3. 数组的获取与使用

通过下标(索引)访问,俩例子:

1
2
3
4
5
6
// 找到下标为0的元素, 赋值为10
ages[0]=10;

// 取出下标为2的元素保存的值
int a = ages[2];
printf("a = %d", a);

4. 数组的遍历

遍历的意思就是有序地查看数组的每一个元素,可以采用循环的方式将每个元素遍历出来,而不用人为的每次获取指定某个位置上的元素。

  • 正序输出(遍历)数组

    1
    2
    3
    4
    int ages[4] = {19, 22, 33, 13};
    for (int i = 0; i < 4; i++) {
    printf("ages[%d] = %d\n", i, ages[i]);
    }
  • 逆序输出(遍历)数组

    1
    2
    3
    4
    5
    int ages[4] = {19,22,33,13};
    for (int i = 3; i >= 0; i--) {
    printf("ages[%d] = %d\n", i, ages[i]);
    }
    //注意,i 的最大值是元素个数减1!
  • 从键盘输入数组长度,构建一个数组,然后再通过for循环从键盘接收数字给数组初始化。并使用for循环输出查看。(此题请查看博文:/2021/12/03/2021-46/ )

注意:

  1. 最好避免出现数组越界访问,循环变量最好不要超出数组的长度.
  2. C语言的数组长度一经声明,长度就是固定,无法改变,并且C语言并不提供检查数组长度的方法。

5. 数组长度计算方法

因为数组在内存中占用的字节数取决于其存储的数据类型和数据的个数。
数组所占用存储空间 = 一个元素所占用存储空间 * 元素个数(数组长度)

所以计算数组长度可以使用如下方法:
数组长度 = 数组占用总字节数 / 数组元素占用字节数

在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符。

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

6. 数组的注意事项

  • 在定义数组的时候[]里面只能写整型常量或者是返回整型常量的表达式
    1
    2
    3
    4
    5
    6
    7
    8
    int ages4['A'] = {19, 22, 33};
    printf("ages4[0] = %d\n", ages4[0]);

    int ages5[5 + 5] = {19, 22, 33};
    printf("ages5[0] = %d\n", ages5[0]);

    int ages5['A' + 5] = {19, 22, 33};
    printf("ages5[0] = %d\n", ages5[0]);
    错误写法:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // 没有指定元素个数,错误
    int a[];

    // []中不能放变量
    int number = 10;
    int ages[number]; // 老版本的C语言规范不支持
    printf("%d\n", ages[4]);

    int number = 10;
    int ages2[number] = {19, 22, 33} // 直接报错

    // 只能在定义数组的时候进行一次性(全部赋值)的初始化
    int ages3[5];
    ages10 = {19, 22, 33};

    // 一个长度为n的数组,最大下标为n-1, 下标范围:0~n-1
    int ages4[4] = {19, 22, 33}
    ages4[8]; // 数组角标越界

7. 数组元素作为函数参数

即把数组中的参数传入函数中,例如:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
void temp(int arrValue)
{
printf("%d\n",arrValue);
}
int main()
{
int arr[5] = {1,2,3,4,5};
temp(arr[3]);

return 0;
}

8. 数组名作为函数参数

整个数组当作函数参数,即把数组名称传入函数中,例如:

此博文未完成,稍后补充!


参考内容

万分感谢学习过程中帮助到我的:

CSDN - c语言入门这一篇就够了-学习笔记(一万字)

CSDN - 13 万字 C 语言从入门到精通保姆级教程2021 年版