当前位置 博文首页 > CW_qian的博客:7月26日笔记C语言基础数组(基本概念,一维数组

    CW_qian的博客:7月26日笔记C语言基础数组(基本概念,一维数组

    作者:[db:作者] 时间:2021-08-25 21:46

    基本概念

    • 逻辑:一次性定义多个相同类型的变量,并存储到一片连续的内存中
    • 示例:?int?a[5];
    • 语法释义:
      • a 是数组名,即这片连续内存的名称
      • [5] 代表这片连续内存总共分成5个相等的格子,每个格子称为数组的元素
      • int 代表每个元素的类型,可以是任意基本类型,也可以是组合类型,甚至可以是数组
    • 初始化:在定义的时候赋值,称为初始化

    // 正常初始化

    int?a[5] = {100,200,300,400,500};

    int?a[5] = {100,200,300,400,500,600}; // 错误,越界了

    int?a[ ] = {100,200,300}; // OK,自动根据初始化列表分配数组元素个数

    int?a[5] = {100,200,300}; // OK,只初始化数组元素的一部分

    100200300400500

    数组的真实存储

    数组元素的引用

    • 存储模式:一片连续的内存,按数据类型分割成若干相同大小的格子
    • 元素下标:数组开头位置的偏移量

    偏移量

    <-- 0<-- 1<-- 2<--3<--4

    数组元素

    100200300400500


    元素下标偏移量

    • 示例:

    int?a[5]; // 有效的下标范围是 0 ~ 4

    a[0] = 1;

    a[1] = 66;

    a[2] = 21;

    a[3] = 4;

    a[4] = 934;

    a[5] = 62; // 错误,越界了

    a ???= 10; // 错误,不可对数组名赋值

    字符数组

    • 概念:专门存放字符的数组,称为字符数组
    • 初始化与元素引用:

    char?s1[5] = {'a', 'b', 'c', 'd', 'e'}; ??????// s1存放的是字符序列,非字符串

    char?s2[6] = {'a', 'b', 'c', 'd', 'e', '\0'}; // s2存放了一个字符串

    char?s[6] = {"abcde"}; // 使用字符串直接初始化字符数组

    char?s[6] = ?"abcde"?; // 大括号可以省略

    s[0] = 'A'; // 索引第一个元素,赋值为 'A'

    多维数组

    • 概念:若数组元素类型也是数组,则该数组称为多维数组
    • 示例:??int?a[2][3];

    // 代码释义:

    // 1, a[2] ??是数组的定义,表示该数组拥有两个元素

    // 2, int [3]是元素的类型,表示该数组元素是一个具有三个元素的整型数组多维数组的语法跟普通的一维数组语法完全一致

    • 初始化:

    int?a[2][3] = {{1,2,3}, {4,5,6}}; // 数组的元素是另一个数组

    int?a[2][3] = {{1,2,3}, {4,5,6}, {7,8,9}}; // 错误,越界了

    int?a[2][3] = {{1,2,3}, {4,5,6,7}}; ???????// 错误,越界了

    int?a[ ][3] = {{1,2,3}, {4,5,6}}; // OK,自动根据初始化列表分配数组元素个数

    int?a[2][3] = {{1,2,3}}; ?????????// OK,只初始化数组元素的一部分

    • 元素引用:

    // a[0] 代表第一个元素,这个元素是一个具有 3 个元素的数组:{1,2,3}

    // a[1] 代表第二个元素,这个元素也是一个具有 3 个元素的数组:{4,5,6}

    printf("%d", a[0][0]); // 输出第一个数组的第一个元素,即1

    printf("%d", a[1][2]); // 输出第二个数组的第三个元素,即6

    数组万能拆解法

    • 任意的数组,不管有多复杂,其定义都由两部分组成。
      • 第1部分:说明元素的类型,可以是任意的类型(除了函数)
      • 第1部分:说明数组名和元素个数
      • 示例:

    int???a[4]; ??????// 第2部分:a[4]; 第1部分:int

    int???b[3][4]; ???// 第2部分:b[3]; 第1部分:int [4]

    int???c[2][3][4]; // 第2部分:c[2]; 第1部分:int [3][4]

    int??*d[6]; ??????// 第2部分:d[6]; 第1部分:int *

    int?(*e[7])(int, float); // 第2部分:e[7]; 第1部分:int (*)(int, float)

    • 注解:
      • 上述示例中,a[4]、b[3]、c[2]、d[6]、e[7]本质上并无区别,它们均是数组
      • 上述示例中,a[4]、b[3]、c[2]、d[6]、e[7]唯一的不同,是它们所存放的元素的不同
      • 第1部分的声明语句,如果由多个单词组成,C语言规定需要将其拆散写到第2部分的两边

    数组 :用于存储一组相同类型的数据,称为数组
    数组划分
    ?? ?1.一维数组
    ?? ?2.二维数组...n维数组
    ?? ?3.字符数组
    ?? ?
    1.一维数组
    ?? ?定义格式
    ?? ??? ?数据类型 ?数组名[整型表达式]
    ?? ??? ?"数据类型"可以是c语言任意类型
    ?? ??? ?"数组名":c语言标识符,数组名为该数组的一个首地址(常量)
    ?? ??? ?"整型表达式":指定数组元素的个数
    ?? ??? ?eg:
    ?? ??? ??? ?int a[5];
    ?? ??? ??? ?
    ?? ?一维数组初始化
    ?? ??? ?(1)全部初始化
    ?? ??? ??? ?int a[5] = {1,2,3,4,5};
    ?? ??? ??? ?
    ?? ??? ?(2)对部分元素初始化,后面的元素自动初始化为0?? ?
    ?? ??? ??? ?int a[5] = {1,2,3};
    ?? ??? ??? ?int a[5] = {0}
    // 全部初始化为0,默认为清空数组里面的内容
    ?? ??? ??? ?
    ?? ??? ?(3)如果对全部数组元素初始化(赋初始值),那么可以不指定数组的长度
    ?? ??? ??? ?int a[] = {1,2,3,4,5}
    ?? ??? ??? ?
    ?? ?数组在内存中的存放:
    ?? ??? ?在连续的地址空间,从低地址到高地址一次连续存放数组中的每一个元素
    ?? ??? ?
    ?? ?输出数组数据的时候 ?是通过数组名加下标的方式输出比如
    ?? ??? ?int a[5] = {1,2,3,4,5};
    ?? ??? ?a[0] = 1;a[1] = 2;a[2] = 3;a[3] = 4;a[4] = 5;

    ?? ???

    2.?? ?二维数组

    ?? ?int [4]; // 定义一个一维数组 ?
    ?? ?我们再定义(a)类型的数组b[3];==》int [4] b[3];====》int b[3][4]// 数组b有3个元素,每个元素的类型是 int[4]类型,表示每个元素里面存放4个int类型的数据
    ?? ?
    ?? ?int b[3][4];
    ?? ?新定义的数组b里面有三个元素,每个元素都是int[4]类型
    ?? ?
    ?? ?虽然二维数组在内存里面是线性存储的,但是我们使用的时候也可以理解为是一个矩阵,例如int b[3][4] 3行4列
    ?? ?
    ?? ?二维数组定义:
    ?? ??? ?数组类型 数组名[整型表达式][整型表达式];
    ?? ??? ??? ??? ??? ??? ?多少行 ? ? ? ?多少列
    ?? ?
    ?? ?二维数组使用
    ?? ??? ?按行存放数据
    ?? ?
    ?? ?二维数组初始化
    ?? ??? ?(1)分行给二维数组赋初始值
    ?? ??? ??? ?int a[2][3] = {{1,2,3},{4,5,6}};
    ?? ??? ?
    ?? ??? ?(2)将所有的数据写在一个{}里面,给数组赋值
    ?? ??? ?int a[2][3] = {1,2,3,4,5,6};
    ?? ??? ?
    ?? ??? ?(3)将部分元素初始化后,其余的默认为0
    ?? ??? ?int a[2][3] = {{1,2},{4,5}}===>a[0][2] == 0 ? a[1][2] == 0
    ?? ??? ?
    ?? ??? ?(4)如果对全部元素赋初始值,则定义数组可以对一维数组的长度省略,但是数组类型里面的元素个数不能省略
    ?? ??? ?int a[][3] = {{1,2,3},{4,5,6}}
    ?? ??? ?
    ?? ?二维数组的输出
    ?? ??? ?数组名[第几行][第几列]
    ?? ??? ?例如 : int a[2][3] = {{1,2,3},{4,5,6}};
    ?? ??? ??? ??? ?a[0][0] = 1; // 第0行第0列?
    ?? ??? ??? ??? ?a[0][1] = 2; // 第0行第1列?
    ?? ??? ??? ??? ?a[0][2] = 3; // 第0行第2列?
    ?? ??? ??? ??? ?a[1][0] = 4; // 第1行第0列?
    ?? ??? ??? ??? ?a[1][1] = 5; // 第1行第1列?
    ?? ??? ??? ??? ?a[1][2] = 6; // 第1行第2列?

    ?

    cs