#864. [基础]数组I

[基础]数组I

👉 数组 I 基础训练

数组I

设问

输入 5 个整数,将它们倒过来输出。

// 代码1
int a1, a2, a3, a4, a5;
cin >> a1 >> a2 >> a3 >> a4 >> a5;
cout << a5 << " " << a4 << " " << a3 << " " << a2 << " " << a1 << endl;

// 代码2
int a[5];
for (int i = 0; i < 5; i ++) {
    cin >> a[i];
}

for (int i = 4; i >= 0; i --) {
    cout << a[i] << " ";
}

代码1用的是 5 个独立的变量,倒过来输出可以解决这个问题,但是若考虑数不止 5 个,而是 100000 个呢?那么这种办法写起来会非常繁琐。

代码2应用了数组这个结构,快速地创建了 5 个长度地空间(即 5 个变量),并以下标(游标)随机引用的方式输入和输出。


一维数组

概念:多个同类型的变量,以下标有序的方式集合到一起。


声明定义int a[N];

定义表示声明了一个 int 类型的数组,名字叫 a,共有 N 个变量(元素)

变量(元素)引用:下标 (游标) 随机引用

第一个变量:a[0]

第二个变量:a[1]

第三个变量:a[2]

...

第 N 个变量:a[N - 1]

名称 a 后面的 [i] 被称为下标,游标。且由上可知,一个 N 个元素的数组,其下标范围是 0 ~ N-1


输入 n 个元素的数组

for (int i = 0; i <= n - 1; i ++) {
    cin >> a[i];
}

从 0 下标开始输出全部元素

for (int i = 0; i <= n - 1; i ++) {
     cout <<  a[i] << " ";
}

由上观察可知,只要能确定下标值,就能引用对应数组中的变量。因此提出以下非常重要的概念:数组的两大核心要素

1. 下标 [i] 2. [i] 下标对应的数值或含义

a[i] = j 这种表述的实际含义。

例:数组 a 中,最大值在下标为 5 的位置。则立刻可知,数组 a 中最大值为 a[5]。

数组初始化

数组若进行未初始化声明,则内部数据是随机的(垃圾数据),例: int a[5];

完整初始化:int a[5] = {3, 0, 9, 2, 1}; // 按顺序分别是 3, 0, 9, 2, 1

部分初始化:int a[5] = {3, 9}; // 除了前两个是 3,9,后面默认初始化为 0 。

特别的:int a[5] = {0}; // 表示将第一个元素初始化为 0 ,剩下的默认初始化为 0。

不定长初始化:int a[] = {3, 0 , 9}; // 由初始化决定数组大小,这里只有 3 个 a[0] , a[1] , a[2] 分别存储 3, 0, 9


注意事项

  • 数组下标从 0 开始,最后一个下标是长度减一的位置。 若下标引用不在这个范围内,则称为数组越界错误。该错误是严重错误。由于语法正确,程序依然会编译执行,但会访问不该访问的空间导致得出错误的结果或崩溃。
  • 数组的声明,[ ] 内强烈建议用常量(数值常量或符号常量)声明。
  • 全局区的数组声明和主函数内部的声明不一样。全局区会默认初始化为 0,且执行速度快。主函数内部需要主动初始化,且执行速度慢。看需要进行选择方式
  • 注意从概念出发理解和使用数组,例如 double a[10]; 即浮点数数组,每一个元素变量都是浮点数类型,用来存储浮点数。char a[10]; 即字符数组,每一个元素变量都是字符类型,用来存储字符。类型不同,存储的数据类型即不同。


根据以上内容,问 int a[0]; 是否合法

{{ select(1) }}

  • 不合法
  • 合法