C++基础语法7——二维数组

一、二维数组的直观理解

1.1 楼房模型比喻

假设酒店的一层连续房间是一维数组,那么整栋酒店楼房就是二维数组

  • 第一下标表示楼层(垂直维度)

  • 第二下标表示房间号(水平维度)

// 声明3层楼,每层5个房间的int型酒店
int hotel[3][5]; 

1.2 内存布局特性

二维数组在内存中采用行优先存储

楼层0:[0][0][0][1][0][2][0][3][0][4]  // 第0层5个房间
楼层1:[1][0][1][1][1][2][1][3][1][4]  // 第1层5个房间
楼层2:[2][0][2][1][2][2][2][3][2][4]  // 第2层5个房间

二、核心操作详解

2.1 声明与初始化

合法声明方式:
// 方式1:显式声明两个维度
int classroom[4][6]; // 4排6列座位

// 方式2:初始化推断第一维度
int chessBoard[][3] = { 
    {1,2,3}, 
    {4,5,6} 
}; // 自动推断为[2][3]

// 方式3:全零初始化
int matrix[5][5] = {0}; // 创建5x5零矩阵
非法声明示例:
int errorArr[][] = {{1,2}, {3,4}}; // 错误!必须指定列数

2.2 元素访问规范

// 正确访问示例
hotel[1][3] = 1001;    // 第二层第四间房入住1001号
cout << hotel[0][2];   // 查看第一层第三间房

// 危险越界访问
cout << hotel[3][0];   // 楼层越界(只有0-2层)
cout << hotel[1][5];   // 房间号越界(每层0-4号)

三、进阶应用技巧

3.1 遍历二维数组

// 经典嵌套循环遍历
int scores[3][4] = {
    {85, 90, 78, 92},
    {76, 88, 95, 81},
    {90, 82, 89, 93}
};

for(int floor=0; floor<3; ++floor) {
    for(int room=0; room<4; ++room) {
        cout << scores[floor][room] << "\t";
    }
    cout << endl;
}

3.2 矩阵转置实现

const int N = 3;
int matrix[N][N] = {{1,2,3}, {4,5,6}, {7,8,9}};

// 转置算法
for(int i=0; i<N; ++i) {
    for(int j=i+1; j<N; ++j) {
        swap(matrix[i][j], matrix[j][i]);
    }
}

四、内存本质揭秘

4.1 地址计算原理

二维数组元素arr[i][j]的地址计算:

地址 = 首地址 + (i * 列数 + j) * sizeof(元素类型)

4.2 与一维数组的关联

// 将二维数组视作连续内存访问
int arr2D[2][3] = {1,2,3,4,5,6};
int* arr1D = &arr2D[0][0]; 

// 通过一维指针访问
cout << arr1D[2*3 + 1]; // 等价于arr2D[2][1]

五、工程实践建议

5.1 参数传递规范

// 正确传递二维数组参数
void printMatrix(int mat[][5], int rows) {
    for(int i=0; i<rows; ++i) {
        for(int j=0; j<5; ++j) {
            cout << mat[i][j] << " ";
        }
        cout << endl;
    }
}

5.2 动态内存方案

// 动态创建二维数组
int** create2DArray(int rows, int cols) {
    int** arr = new int*[rows];
    for(int i=0; i<rows; ++i) {
        arr[i] = new int[cols];
    }
    return arr;
}

六、典型应用场景

6.1 游戏地图系统

// 10x10游戏地图
char gameMap[10][10] = {
    {'#','#','#','#','#','#','#','#','#','#'},
    {'#',' ',' ',' ','#',' ',' ',' ',' ','#'},
    {'#',' ','$',' ','#',' ','@',' ',' ','#'},
    // ... 其他行数据
};

6.2 学生成绩管理

const int STUDENTS = 50;
const int COURSES = 5;
double gradeTable[STUDENTS][COURSES];

// 录入第3个学生的成绩
gradeTable[2][0] = 89.5;  // 数学
gradeTable[2][1] = 78.0;  // 英语
// ... 其他科目

七、常见错误排查

  1. 维度混淆错误

int arr[3][4];
arr[4][2] = 5; // 行下标越界(最大2)

     2.初始化不匹配

int arr[2][3] = {{1,2}, {3}}; // 第二行自动补零→{3,0,0}

八、综合训练题

题目1:储物柜

储物柜,共5层,每层有5个抽屉,每个抽屉里都放了价值为x元(随机生成1000元以内)的物品。你的任务是找出哪个抽屉里的物品价值最高,为多少元?

例如:第二行第四个抽屉存放的物品价值最高,801元。

参考代码:

    int a[5][5];
    srand(time(0));//生成随机数的种子  头文件<ctime>
    for(int i=0; i<5; i++) //表示层数,这里是5层
    {
        for(int j=0; j<5; j++)//表示列数,这里是5列 
        {
            a[i][j]=rand()%1000;
        }
    }
    for(int i=0; i<5; i++) //循环输出每层
    {
        for(int j=0; j<5; j++)//循环输出每列 
        {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl;
    int m=a[0][0];//定义一个最大值 
    for(int i=0; i<5; i++)
    {
        for(int j=0; j<5; j++)
        {
            if(a[i][j]>m)//通过交换得到最大值 
            {
                m=a[i][j];
            }
        }
    }
    cout<<"最大值为:"<<m;

题目2:打印图形

请输入一个数字n,在屏幕上输出符合图示图形规律的n×n的图形。

例如:输入5,会输出下列图形:

 参考代码:

     int i,j;
    char a[5][5];
    int n;
    cin>>n; 
    for(i=0; i<n; i++)//一共有几层
    {
        for(j=0; j<n; j++)
        {
            if(i<j)//纵坐标大于横坐标 
            {
                a[i][j]='-';
            }
            if(i==j)  //纵坐标和横坐标都是相等的 
            {
                a[i][j]='+';
            }
            if(i>j)  //横坐标大于纵坐标 
            {
                a[i][j]='*';
            }
        }
    }
    for(i=0; i<5; i++)
    {
        for(j=0; j<5; j++)
        {
            cout<<a[i][j]<<' ';
        }
        cout<<endl;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值