C++ 一维、二维、三维数组完整演示

文章目录

C++ 一维、二维、三维数组完整演示

完整可运行代码

cpp 复制代码
#include <iostream>
#include <iomanip>
using namespace std;

/**
 * 一维、二维、三维数组全方位演示
 * 作者:C++教育
 * 描述:展示三种数组的定义、初始化、访问方式和内存布局
 */

// ==================== 辅助函数 ====================

// 打印分隔线
void printSeparator(const string& title) {
    cout << "\n" << string(60, '=') << endl;
    cout << " " << title << endl;
    cout << string(60, '=') << endl;
}

// 打印内存地址
void printAddress(const string& name, void* addr) {
    cout << left << setw(15) << name << " 地址: " << addr << endl;
}

// ==================== 一维数组演示 ====================

void demonstrate1DArray() {
    printSeparator("一维数组演示 (1D Array)");
    
    // 1. 定义和初始化
    cout << "1. 定义和初始化:" << endl;
    int arr1D[5] = {10, 20, 30, 40, 50};
    // 也可以写作:int arr1D[] = {10, 20, 30, 40, 50};
    
    // 2. 打印数组内容
    cout << "\n2. 数组内容:arr1D = [";
    for(int i = 0; i < 5; i++) {
        cout << arr1D[i];
        if(i < 4) cout << ", ";
    }
    cout << "]" << endl;
    
    // 3. 内存布局演示
    cout << "\n3. 内存布局(连续存储):" << endl;
    cout << "   索引: ";
    for(int i = 0; i < 5; i++) {
        cout << setw(10) << i;
    }
    cout << "\n   值:   ";
    for(int i = 0; i < 5; i++) {
        cout << setw(10) << arr1D[i];
    }
    cout << "\n   地址: ";
    for(int i = 0; i < 5; i++) {
        cout << setw(10) << &arr1D[i];
    }
    cout << endl;
    
    // 4. 访问方式演示
    cout << "\n4. 访问方式:" << endl;
    cout << "   arr1D[2] = " << arr1D[2] << "  (直接下标访问)" << endl;
    cout << "   *(arr1D + 2) = " << *(arr1D + 2) << "  (指针运算)" << endl;
    
    // 5. 大小信息
    cout << "\n5. 大小信息:" << endl;
    cout << "   整个数组大小: " << sizeof(arr1D) << " 字节" << endl;
    cout << "   每个元素大小: " << sizeof(arr1D[0]) << " 字节" << endl;
    cout << "   数组长度: " << sizeof(arr1D) / sizeof(arr1D[0]) << " 个元素" << endl;
}

// ==================== 二维数组演示 ====================

void demonstrate2DArray() {
    printSeparator("二维数组演示 (2D Array)");
    
    // 1. 定义和初始化
    cout << "1. 定义和初始化:" << endl;
    int arr2D[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    
    // 2. 打印数组内容(矩阵形式)
    cout << "\n2. 数组内容(3行×4列):" << endl;
    cout << "      列0 列1 列2 列3" << endl;
    for(int i = 0; i < 3; i++) {
        cout << "行" << i << ":  ";
        for(int j = 0; j < 4; j++) {
            cout << setw(3) << arr2D[i][j] << " ";
        }
        cout << endl;
    }
    
    // 3. 内存布局(行优先)
    cout << "\n3. 内存布局(行优先存储):" << endl;
    cout << "   实际内存中的顺序:" << endl;
    cout << "   ";
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 4; j++) {
            cout << "arr2D[" << i << "][" << j << "]=" << arr2D[i][j];
            if(!(i == 2 && j == 3)) cout << " → ";
        }
    }
    cout << endl;
    
    // 4. 地址连续性验证
    cout << "\n4. 地址连续性验证:" << endl;
    cout << "   元素              地址           间隔" << endl;
    int* p = &arr2D[0][0];
    for(int i = 0; i < 12; i++) {
        cout << "   arr2D[" << i/4 << "][" << i%4 << "]  " 
             << &p[i] << "  ";
        if(i > 0) {
            cout << "+" << ((char*)&p[i] - (char*)&p[i-1]) << "字节";
        }
        cout << endl;
    }
    
    // 5. 层次结构演示
    cout << "\n5. 层次结构(二维数组是一维数组的数组):" << endl;
    cout << "   arr2D 的类型: int[3][4]  (二维数组)" << endl;
    cout << "   arr2D[0]的类型: int[4]    (一维数组,第一行)" << endl;
    cout << "   arr2D[1]的类型: int[4]    (一维数组,第二行)" << endl;
    cout << "   arr2D[2]的类型: int[4]    (一维数组,第三行)" << endl;
    
    // 6. 行地址验证
    cout << "\n6. 行地址验证:" << endl;
    printAddress("arr2D[0]", arr2D[0]);
    printAddress("arr2D[1]", arr2D[1]);
    printAddress("arr2D[2]", arr2D[2]);
    cout << "   行间隔: " << (char*)arr2D[1] - (char*)arr2D[0] << " 字节" << endl;
}

// ==================== 三维数组演示 ====================

void demonstrate3DArray() {
    printSeparator("三维数组演示 (3D Array)");
    
    // 1. 定义和初始化
    cout << "1. 定义和初始化:" << endl;
    int arr3D[2][3][4] = {
        {  // 第一层 (z=0)
            {1, 2, 3, 4},      // 行0
            {5, 6, 7, 8},      // 行1
            {9, 10, 11, 12}    // 行2
        },
        {  // 第二层 (z=1)
            {13, 14, 15, 16},  // 行0
            {17, 18, 19, 20},  // 行1
            {21, 22, 23, 24}   // 行2
        }
    };
    
    // 2. 打印数组内容(三层结构)
    cout << "\n2. 数组内容(2层 × 3行 × 4列):" << endl;
    for(int z = 0; z < 2; z++) {
        cout << "\n   第" << z << "层 (z=" << z << "):" << endl;
        cout << "      列0 列1 列2 列3" << endl;
        for(int y = 0; y < 3; y++) {
            cout << "   行" << y << ":  ";
            for(int x = 0; x < 4; x++) {
                cout << setw(3) << arr3D[z][y][x] << " ";
            }
            cout << endl;
        }
    }
    
    // 3. 内存布局演示
    cout << "\n3. 内存布局(行优先,层优先):" << endl;
    cout << "   所有24个元素在内存中的顺序:" << endl;
    cout << "   ";
    int count = 0;
    for(int z = 0; z < 2; z++) {
        for(int y = 0; y < 3; y++) {
            for(int x = 0; x < 4; x++) {
                cout << "[" << z << "][" << y << "][" << x << "]=" 
                     << setw(2) << arr3D[z][y][x];
                count++;
                if(count < 24) cout << " → ";
                if(count % 4 == 0 && count < 24) cout << "\n   ";
            }
        }
    }
    cout << endl;
    
    // 4. 地址连续性验证
    cout << "\n4. 地址连续性验证(前12个元素):" << endl;
    cout << "   元素            地址           值" << endl;
    int* p = &arr3D[0][0][0];
    for(int i = 0; i < 12; i++) {
        cout << "   [" << i/12 << "][" << (i/4)%3 << "][" << i%4 << "]  "
             << &p[i] << "  " << setw(2) << p[i];
        if(i > 0) {
            cout << "  (+" << ((char*)&p[i] - (char*)&p[i-1]) << "字节)";
        }
        cout << endl;
    }
    
    // 5. 寻址公式演示
    cout << "\n5. 寻址公式演示:" << endl;
    int z = 1, y = 2, x = 3;
    int expected = arr3D[z][y][x];
    int offset = (z * 3 * 4) + (y * 4) + x;
    int calculated = *(p + offset);
    
    cout << "   查找 arr3D[1][2][3]:" << endl;
    cout << "   直接访问: " << expected << endl;
    cout << "   公式计算: " << calculated << endl;
    cout << "   偏移量: " << offset << " (从首地址向后移动" 
         << offset << "个int,即" << offset * sizeof(int) << "字节)" << endl;
    cout << "   验证: " << (expected == calculated ? "✓ 正确" : "✗ 错误") << endl;
    
    // 6. 层次结构演示
    cout << "\n6. 层次结构(三维数组是二维数组的数组):" << endl;
    cout << "   arr3D 的类型: int[2][3][4]  (三维数组)" << endl;
    cout << "   arr3D[0]的类型: int[3][4]    (二维数组,第一层)" << endl;
    cout << "   arr3D[1]的类型: int[3][4]    (二维数组,第二层)" << endl;
    cout << "   arr3D[0][0]的类型: int[4]    (一维数组,第一层第一行)" << endl;
    cout << "   arr3D[0][0][0]的类型: int    (单个整数)" << endl;
    
    // 7. 层地址验证
    cout << "\n7. 层地址验证:" << endl;
    printAddress("arr3D[0]", arr3D[0]);
    printAddress("arr3D[1]", arr3D[1]);
    cout << "   层间隔: " << (char*)arr3D[1] - (char*)arr3D[0] << " 字节" << endl;
    cout << "   每层大小: " << sizeof(arr3D[0]) << " 字节" << endl;
}

// ==================== 性能对比演示 ====================

void demonstratePerformance() {
    printSeparator("访问性能对比");
    
    const int D = 100, H = 50, W = 40;
    int arr3D[D][H][W];
    int value = 0;
    
    cout << "三维数组大小: " << D << "×" << H << "×" << W << " = "
         << D * H * W << " 个元素" << endl;
    
    // 方法1:按内存顺序访问(最快)
    cout << "\n1. 按内存顺序访问(行优先):" << endl;
    clock_t start = clock();
    for(int z = 0; z < D; z++) {
        for(int y = 0; y < H; y++) {
            for(int x = 0; x < W; x++) {
                arr3D[z][y][x] = value++;
            }
        }
    }
    clock_t end = clock();
    cout << "   耗时: " << double(end - start) / CLOCKS_PER_SEC * 1000 << " 毫秒" << endl;
    
    // 方法2:按非内存顺序访问(最慢)
    cout << "\n2. 按非内存顺序访问(列优先):" << endl;
    start = clock();
    for(int x = 0; x < W; x++) {
        for(int y = 0; y < H; y++) {
            for(int z = 0; z < D; z++) {
                arr3D[z][y][x] = value++;
            }
        }
    }
    end = clock();
    cout << "   耗时: " << double(end - start) / CLOCKS_PER_SEC * 1000 << " 毫秒" << endl;
    
    cout << "\n结论:按内存顺序访问(最内层循环是最右边的下标)性能最好!" << endl;
}

// ==================== 主函数 ====================

int main() {
    cout << "============================================================" << endl;
    cout << "     C++ 一维、二维、三维数组完整演示" << endl;
    cout << "============================================================" << endl;
    
    // 演示一维数组
    demonstrate1DArray();
    
    // 演示二维数组
    demonstrate2DArray();
    
    // 演示三维数组
    demonstrate3DArray();
    
    // 性能对比(可选,因为需要大量计算,可以注释掉)
    // demonstratePerformance();
    
    cout << "\n\n演示完成!" << endl;
    return 0;
}

// ==================== 扩展:动态数组 ====================

/*
 * 动态三维数组的创建和使用
 */
void demonstrateDynamic3D() {
    cout << "\n--- 动态三维数组演示 ---" << endl;
    
    int d = 2, h = 3, w = 4;
    
    // 动态分配三维数组
    int*** dynamic3D = new int**[d];
    for(int i = 0; i < d; i++) {
        dynamic3D[i] = new int*[h];
        for(int j = 0; j < h; j++) {
            dynamic3D[i][j] = new int[w];
        }
    }
    
    // 赋值
    int val = 0;
    for(int i = 0; i < d; i++) {
        for(int j = 0; j < h; j++) {
            for(int k = 0; k < w; k++) {
                dynamic3D[i][j][k] = val++;
            }
        }
    }
    
    // 访问
    cout << "dynamic3D[1][2][3] = " << dynamic3D[1][2][3] << endl;
    
    // 释放内存
    for(int i = 0; i < d; i++) {
        for(int j = 0; j < h; j++) {
            delete[] dynamic3D[i][j];
        }
        delete[] dynamic3D[i];
    }
    delete[] dynamic3D;
    
    cout << "动态数组已释放" << endl;
}

运行结果预览

当你运行这个程序时,会看到类似以下的输出:

复制代码
============================================================
     C++ 一维、二维、三维数组完整演示
============================================================

============================================================
 一维数组演示 (1D Array)
============================================================
1. 定义和初始化:

2. 数组内容:arr1D = [10, 20, 30, 40, 50]

3. 内存布局(连续存储):
   索引:          0         1         2         3         4
   值:           10        20        30        40        50
   地址: 0x61fdf0 0x61fdf4 0x61fdf8 0x61fdfc 0x61fe00

4. 访问方式:
   arr1D[2] = 30  (直接下标访问)
   *(arr1D + 2) = 30  (指针运算)

5. 大小信息:
   整个数组大小: 20 字节
   每个元素大小: 4 字节
   数组长度: 5 个元素

...(后续输出类似)

关键要点总结

  1. 一维数组:最简单的线性结构,内存中连续存储
  2. 二维数组:数组的数组,每一行是一个一维数组
  3. 三维数组:数组的数组的数组,每一层是一个二维数组
  4. 内存布局:所有维度最终都是一维线性存储
  5. 访问方式:可以使用下标或指针运算
  6. 性能优化:按照内存顺序访问可以获得最佳性能

这个程序完整展示了三种数组的定义、初始化、访问方式、内存布局和层次结构,适合学习和参考。

相关推荐
闻缺陷则喜何志丹2 小时前
【构造】P9215 [入门赛 #11] [yLOI2021] 扶苏与 1 (Hard Version)|普及+
c++·算法·洛谷·构造
~央千澈~2 小时前
抖音弹幕游戏开发之第14集:添加更多整蛊效果·优雅草云桧·卓伊凡
开发语言·python·游戏
航哥的女人2 小时前
setsockopt()详解
c++·tcp/ip
阿猿收手吧!2 小时前
【Linux/C++】线程切换与协程切换,协程池
linux·c++
百锦再2 小时前
Java synchronized关键字详解:从入门到原理(两课时)
java·开发语言·struts·spring·kafka·tomcat·maven
油丶酸萝卜别吃2 小时前
什么是 Java 内存模型(JMM)?
java·开发语言
量子炒饭大师3 小时前
【C++入门】Cyber神经的义体插件 —— 【类与对象】内部类
java·开发语言·c++·内部类·嵌套类
Hx_Ma163 小时前
测试题(四)
java·开发语言·jvm
xiaoye-duck3 小时前
C++ 模板进阶:从非类型参数、特化到分离编译,吃透 C++ 泛型编程的核心逻辑
c++·面试·模板