第6.1章 – C++复合型变量 – 数组

数组

在程序中为了处理方便,常常需要把具有相同类型的数据对象按有序的形式排列起来,形成“一组”数据,这就是“数组”(array)。

图片[1]-第6.1章 – C++复合型变量 – 数组-织秋笔记

数组中的数据,在内存中是连续存放的,每个元素占据相同大小的空间,就像排好队一样。

数组的定义

数组的定义形式如下:

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

  • 首先需要声明类型,数组中所有元素必须具有相同的数据类型;

  • 数组名是一个标识符;后面跟着中括号,里面定义了数组中元素的个数,也就是数组的“长度”;

  • 元素个数也是类型的一部分,所以必须是确定的;

int a1[10];          // 定义一个数组a1,元素类型为int,个数为10

    const int n = 4;
    double a2[n];        // 元素个数可以是常量表达式

    int i = 5;
    //int a3[i];      // 错误,元素个数不能为变量

需要注意,并没有通用的“数组”类型,所以上面的a1、a2的类型分别是“int数组”和“double数组”。这也是为什么我们把数组叫做“复合数据类型”。

数组的初始化

int a3[4] = {1,2,3,4};
    float a4[] = {2.5, 3.8, 10.1};    // 正确,初始值说明了元素个数是3
    short a5[10] = {3,6,9};    // 正确,指定了前三个元素,其余都为0
    //long a6[2] = {3,6,9};    // 错误,初始值太多
//int a6[4] = a3;          // 错误,不能用另一个数组对数组赋值

需要注意的是:

  • 对数组做初始化,要使用花括号{}括起来的数值序列;

  • 如果做了初始化,数组定义时的元素个数可以省略,编译器可以根据初始化列表自动推断出来;

  • 初始值的个数,不能超过指定的元素个数;

  • 初始值的个数,如果小于元素个数,那么会用列表中的值初始化靠前的元素;剩余元素用默认值填充,整型的默认值就是0;

  • 如果没有做初始化,数组中元素的值都是未定义的;这一点和普通的局部变量一致;

数组的访问

(1)访问数组元素

数组元素在内存中是连续存放的,它们排好了队之后就会有一个队伍中的编号,称为“索引”,也叫“下标”;通过下标就可以快速访问每个元素了,具体形式为:

数组名[元素下标]

这里也是用了中括号来表示元素下标位置,被称为“下标运算符”。比如a[2]就表示数组a中下标为2的元素,可以取它的值输出,也可以对它赋值。

int a[] = {1,2,3,4,5,6,7,8};
    cout << "a[2] = " << a[2] << endl;    // a[2] = 3

    a[2] = 36;
    cout << "a[2] = " << a[2] << endl;    // a[2] = 36

在上方代码中,如果cout不定义位置的情况下,会直接打印数组的所有数据

需要注意的是:

<font color="red">

  • 数组的下标从0开始;

    </font>

  • 因此a[2]访问的并不是数组a的第2个元素,而是第三个元素;一个长度为10的数组,下标范围是0~9,而不是1~10;

  • 合理的下标,不能小于0,也不能大于 (数组长度 - 1);否则就会出现数组下标越界;

数组的大小 (获取数组的个数)

所有的变量,都会在内存中占据一定大小的空间;而数据类型就决定了它具体的大小。而对于数组这样的“复合类型”,由于每个元素类型相同,因此占据空间大小的计算遵循下面的简单公式:

数组所占空间 = 数据类型所占空间大小 * 元素个数
        // a是已定义的数组
cout << "a所占空间大小:" << sizeof(a) << endl;
cout << "每个元素所占空间大小:" << sizeof(a[0]) << endl;
// 获取数组长度
    int aSize = sizeof(a) / sizeof(a[0]);
    cout << "数组a的元素个数:" << aSize << endl;

遍历数组

如果想要依次访问数组中所有的元素,就叫做“遍历数组”。我们当然可以用下标去挨个读取:

cout << "a[0] = " << a[0] << endl;
cout << "a[1] = " << a[1] << endl;

更好的方式是使用for循环:

    // 获取数组长度
    int aSize = sizeof(a) / sizeof(a[0]);

    for (int i = 0; i < aSize; i++ )
    {
        cout << "a[" << i << "] = " << a[i] << endl;
    }

<font color="red">
循环条件如果写一个具体的数,很容易出现下标越界的情况;而如果知道了数组长度,直接让循环变量i小于它就可以了。

更简单的写法,就是范围for循环,缺点是无法获取元素对应的下标:</font>

    for (int num: a )
    {
        cout << num << endl;
    }
© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容