详解C++中的一维数组和二维数组:定义、初始化与常见应用

一只小鹿
一只小鹿
发布时间:2026-10-13 | 3人浏览过
原创

C++数组是用于存储同类型数据集合的基础工具。本文系统讲解一维数组和二维数组的定义语法、初始化方法及引用规则,澄清常量表达式在定长数组中的使用限制。结合冒泡排序、斐波那契数列计算及矩阵转置三个实际代码示例,直观展示数组在内存中的线性排列逻辑(如图片所示)及操作技巧。

一维数组的定义与引用

第1步:理解数组定义的语法规则

一维数组是有序数据的集合,其定义格式为:
  类型标识符 数组名[常量表达式];
例如:int a[10]; 表示名为 a 的整型数组,包含10个元素。
注意以下几点:

  • 命名规则:数组名遵循普通标识符规则。
  • 下标含义:方括号内的值代表数组长度(即元素个数)。下标从 0 开始,因此 a[10] 中的元素依次是 a[0] 至 a[9],不存在 a[10]。
  • 常量表达式的限制:数组大小必须是编译时可确定的常量。表达式中可以包含常量、常变量或符号常量,不能包含运行时的普通变量。例如:
    // 合法
    const int n = 5;
    int a[n * 2];
    // 非法:变量不能作为长度
    int m;
    cin >> m;
    int arr[m];

第2步:访问元素与赋值

C++只允许逐个引用数组元素,不支持整个数组的整体输入输出。
引用形式:数组名[下标]
例如 a[0] = 5; 或 b[i+j] = a[i] + a[j];。下标可以是整型表达式。务必确保下标不越界。

一维数组的初始化与应用示例

第3步:掌握多种初始化方式

可以在定义时赋予初始值,若不指定初值,全局变量默认为0,局部变量则为随机值。

  1. 完全初始化:
    int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  2. 部分初始化:
    int a[10] = {0, 1, 2}; // 剩余元素自动补0
  3. 省略长度:若提供了全部初值,可省略第一维长度,由编译器自动推断。
    int a[] = {1, 2, 3, 4, 5}; // 长度为5

第4步:实战应用——起泡法排序与数列计算

起泡法(冒泡排序)示例:
将相邻两数比较,小的调前头。若有 n 个数,需进行 n-1 趟比较。第 j 趟需比较 n-j 次。


上述图示展示了起泡排序中相邻元素交换的过程。


此图进一步说明了多轮比较后的结果分布规律。

#include <iostream>
using namespace std;
int main() {
    int a[11]; // 为了习惯,通常从a[1]到a[10]使用
    cout << "input 10 numbers: " << endl;
    for (int i = 1; i <= 10; i++) cin >> a[i];
    
    // 冒泡排序核心逻辑
    for (int j = 1; j <= 9; j++) {
        for (int i = 1; i <= 10 - j; i++) {
            if (a[i] > a[i+1]) {
                int t = a[i]; a[i] = a[i+1]; a[i+1] = t;
            }
        }
    }
    // 输出结果...
}

Fibonacci数列求解:使用前两个已知项推导后续项,体现数组递推特性。

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
    int f[20] = {1, 1};
    for (int i = 2; i < 20; i++) f[i] = f[i-2] + f[i-1];
    // ...输出处理...

二维数组的定义与内存布局

第5步:理解二维数组的定义格式

二维数组定义为:类型标识符 数组名[常量表达式][常量表达式];
例如:float a[3][4]; 定义了一个 3×4 的矩阵。
重要区分:不要写成 [3,4]。在C++逻辑中,二维数组可以被视为“数组的数组”,即 a 是一个拥有3个元素的一维数组,其中每个元素又是拥有4个元素的数组。

第6步:分析内存存储顺序

C++中二维数组采用按行存放的原则。即先存完第一行的所有元素,再存第二行。这种线性存储方式对指针运算和内存优化至关重要。


上表模拟了一个成绩二维表的数据结构,展示了如何通过行列索引定位特定值。

该图形象化展示了二维数组作为“嵌套一维数组”的逻辑结构。

此内存视图显示了元素 a[0][0] 到 a[2][3] 在物理内存中的连续排列方式。

再次强调二维数组在底层内存中的行优先存储模型。

二维数组的初始化与复杂应用

第7步:多维与部分初始化策略

初始化二维数组主要有两种方式:

  1. 分行赋值(推荐):
    int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
    界限清晰,不易出错。
  2. 全部扁平化赋值:
    int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8};//效果同上

对于稀疏矩阵(非零元素少),可使用未初始化的默认值为0的特性来节省代码量:

int a[3][4] = {{1}, {0, 6}};

定义时可以省略第一维长度 a[][4],因为列数决定了如何切割内存块。但不能省略第二维长度。

第8步:实战应用——矩阵转置与极值查找

矩阵转置:将 A[i][j] 的值赋给 B[j][i],实现行列互换。


此图对比了原始矩阵与其转置矩阵在行列位置上的映射关系。
for(int i=0; i<=1; i++) {
    for(int j=0; j<=2; j++) {
        b[j][i] = a[i][j]; // 核心转置逻辑
    }
}

二维数组求最大值:遍历所有元素并与当前最大值比较,记录坐标。

int max = a[0][0];
int row = 0, col = 0;
for(int i=0; i<3; i++) {
    for(int j=0; j<4; j++) {
        if(a[i][j] > max) {
            max = a[i][j];
            row = i; col = j;
        }
    }
}

以上就是C++一维和二维数组的详细教学内容,更多关于C++基础语法与数据结构进阶的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表