学习辅导:一维数组

  要记录一位同学的身高,可以定义一个变量,然后将身高存入变量即可。如果有1000位同学呢?难道要创建1000个变量分别存储每位同学的身高吗?很显然,这么操作过于繁琐和死板,于是,C++的设计者创造了一种特殊的变量,确切来说是一种数据结构:用一个变量存储若干数据(反言之,将若干个数据构造成一个变量),数组(Array)。

一、认识数组

1、什么是数组

  数组是一组具有相同数据类型的有序的数据的集合。一个数组可以存储大量数据,相当于一次性批量定义了很多变量。虽然数组里有多个数据,但数组是一个整体,它的内存空间是连续的。当数组内的元素都是单个数据的的时候(只有一个维度,即一列数据),叫作“一维数组”。

2、一维数组的声明

  跟普通变量定义相似,先声明类型,再声明名称,紧跟着加一对方括号,再填入一个数字,表示存储数据的个数,即数组长度或大小。
一维数组声明示例:

// 声明一个整型数组 a,数组的长度为 10
int a[10];

以上示例,声明了一个一维数组 a,该数组有 10 个成员(也叫元素),且每个成员的数据类型都是 int 类型。注意:1、声明数组的时候,必须要指明长度;2、数组的成员编号(索引)从0开始。上面例子中,数组长度 10 是必须要指明的,数组 a 的第一个成员的索引(编号)是 0,最后一个成员的索引(编号)是 9。

3、一维数组的访问与赋值

  普通变量声明之后,不赋初值也能访问,但是访问到的数据不确定。同样,数组声明之后,不赋初值也能访问,访问到的数据也不确定。直接使用数组名称,访问到的是数组在内存中的地址。如果想要访问数组里面的元素,需要在数组名称后面加上一对方括号,括号内填入想要访问的元素的索引。

3-1、一维数组访问示例:

# include <bits/stdc++.h>
using namespace std;
int main() {
    int a[10];    // 声明 int 类型长度为 10 的一维数组 a
    cout << a << endl;       // 输出数组 a
    cout << a[1] << endl;    // 输出数组 a 的 第2个 元素
    // 使用 for 循环,输出一维数组 a 的 第6~10个 元素
    for (int i = 5; i < 10; i++) cout << a[i] << endl;
    return 0;
}

C++可以支持负索引,比如,-1表示最后一个元素,-3表示倒数第3个元素。
  如果不赋初值,数组元素是允许访问的,但系统会胡乱返回一个结果。因为计算机的输出具有确定性,所以胡乱返回的结果是不能参与运算的。如果变量想参与运算,必须要赋初值。数组本身只能访问,无法赋值,只能对数组内部的元素进行赋值。

3-2、一维数组元素赋值示例:

# include <bits/stdc++.h>
using namespace std;
 
int main() {
    int a[10];    // 声明 int 类型长度为 10 的一维数组 a 
    a[0] = 10;    // 为数组 a 的第 1 个元素赋值 
    a[4] = 50;    // 为数组 a 的第 5 个元素赋值 
    a[7] = 80;    // 为数组 a 的第 8 个元素赋值 
    // 使用 for 循环,格式化输出一维数组 a 的 所有元素 
    for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
    return 0;
}

3-3、一维数组批量赋值示例:

# include <bits/stdc++.h>
using namespace std;
 
int main() {
    int a[10];    // 声明 int 类型长度为 10 的一维数组 a 
    // 使用 for 循环,为数组 a 批量赋值
    for (int i = 0; i < 10; i++) a[i] = i; 
    // 使用 for 循环,格式化输出一维数组 a 的 所有元素 
    for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
    return 0;
}

4、一维数组声明的同时赋初值

  跟普通变量一样,可以只声明不赋值,也可以声明的时候,直接赋值。不同的是,数组里有多个元素,所以赋值的时候要给出多个数据,数据与数据之间用英文逗号分隔,并将所有的数据用一对花括号封装起来。

4-1、一维数组声明并赋初值示例:

// 声明一个整型数组 a,数组的长度为 10,并赋初值
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

以上示例,声明了一个长度为10的int类型数组a,同时为每个元素赋初值,第一个元素的值为0,第二个元素的值为1,第三个元素的值为2......第十个元素的值为9。
如果声明的时候,花括号里给定的数据个数小于数组长度会发什么?
请完成以下实验,尝试总结规律。

4-2、数组赋初值实验程序1:

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  // 声明int类型长度为10的数组a,并给定5个初值 
    int a[10] = {1, 2, 3, 4, 5};
    // 使用 for 循环,格式化输出一维数组 a 的 所有元素 
    for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
    return 0;
}

4-3、数组赋初值实验程序2:

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  // 声明int类型长度为10的数组a,并给定1个初值 
    int a[10] = {0};
    // 使用 for 循环,格式化输出一维数组 a 的 所有元素 
    for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
    return 0;
}

4-4、数组赋初值实验程序3:

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  // 声明int类型长度为10的数组a,并给定1个初值 
    int a[10] = {1};
    // 使用 for 循环,格式化输出一维数组 a 的 所有元素 
    for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
    return 0;
}

通过以上实验,我们能得出以下结论:
1、将给定的初始值依次分配给数组元素;
2、没分配到初值的数组元素设为默认值。
思考一下:如何将所有元素都设为1?

4-5、赋初值参考程序1:

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  // 声明int类型长度为10的数组a,并将所有元素设为1 
    int a[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    // 使用 for 循环,格式化输出一维数组 a 的 所有元素 
    for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
    return 0;
}

4-6、赋初值参考程序2:

#include <bits/stdc++.h>
using namespace std;
 
int main() {
    int a[10];    // 声明 int 类型长度为 10 的数组 a
    // 使用 for 循环,将数组 a 里的每个元素都设为 1 
    for (int i = 0; i < 10; i++) a[i] = 1;
    // 使用 for 循环,格式化输出一维数组 a 的 所有元素 
    for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
    return 0;
}

以上两种赋初值的方式都可以,根据实际情况,灵活运用。

二、一维数组的长度

1、获取字节长度

sizeof() 函数可以获取给定参数的字节长度。
比如,获取整形变量 n 的字节长度:

int n = 123456;    // 声明整型变量 n,并赋初值 123456
cout << sizeof(n) << endl;    // 输出该变量占用的字节长度

2、计算数组长度

先使用 sizeof() 函数获取数组的字节长度,再使用 sizeof() 函数获取数组内任意一个元素的的字节长度(通常使用第一个元素),然后两者相除,就能计算出数组内包含元素的个数,即数组的长度。

#include <bits/stdc++.h>
using namespace std;
 
int main() {
    int a[20];    // 声明一个数组
    cout << sizeof(a) / sizeof(a[0]);    // 输出该数组的长度
    return 0;
}

三、数组的变通用法

如果将前10名同学的总分存入列表scores中,那么scores[0]表示第1名的成绩,scores[1]表示第2名的成绩,这种表达总感觉不自然。
我们更习惯用scores[1]表示第1名的成绩,scores[2]表示第2名的成绩。
为此,只需在创建列表的时候,将列表长度设置大一点即可。

在使用的时候,第1个元素(索引为0的元素)忽略不用,从第2个元素(索引号为1的元素)开始使用。

上述示例代码如下:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int scores[11];    // 存储前 10 名的成绩,数组长度声明为 11 
    // 使用 for 循环,跳过 0 号元素,为剩余元素赋值
    for (int i = 1; i <= 10; i++) scores[i] = 100 -i;
    // 使用 for 循环,依次输出 1~10 名的分数
    for (int i = 1; i <= 10; i++) {
        printf("第%d名:%d\n", i, scores[i]); 
    }
    return 0;
}
posted @ 2026-01-29 10:09  gdyyx  阅读(2)  评论(0)    收藏  举报