文章目录
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 个元素
...(后续输出类似)
关键要点总结
- 一维数组:最简单的线性结构,内存中连续存储
- 二维数组:数组的数组,每一行是一个一维数组
- 三维数组:数组的数组的数组,每一层是一个二维数组
- 内存布局:所有维度最终都是一维线性存储
- 访问方式:可以使用下标或指针运算
- 性能优化:按照内存顺序访问可以获得最佳性能
这个程序完整展示了三种数组的定义、初始化、访问方式、内存布局和层次结构,适合学习和参考。