You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中用指针实现矩阵初始化函数(扫雷作业)

使用指针操作C语言中的扫雷矩阵

要在C语言中用指针替代[i][j]下标操作矩阵,核心是利用指针算术计算元素的内存偏移。由于你使用的是变长数组(VLA)(行列数由用户输入决定),初始化函数需要同时接收行列数,才能正确计算每个元素的位置。

关键原理

C语言中,二维数组的内存是连续存储的:第0行的所有元素之后紧接着第1行的元素,以此类推。因此,矩阵中第i行第j列的元素,相对于数组起始地址的偏移量为 i * columns + j(columns是列数)。通过指针访问该元素的方式为:*(起始指针 + 偏移量),这与minesweeper[i][j]完全等价。

修改后的完整代码

#include <stdio.h>

// 初始化函数:接收行列数和矩阵起始指针
void initializeMinesWeeper(int rows, int columns, char *minesweeper) {
    // 遍历所有元素,用指针赋值
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < columns; ++j) {
            // 计算偏移量并赋值,这里用'-'作为初始占位符
            *(minesweeper + i * columns + j) = '-';
        }
    }
}

int main() {
    int rows;
    int columns;
    printf("请输入行数: ");
    scanf("%d", &rows);
    printf("请输入列数: ");
    scanf("%d", &columns);
    
    // 定义变长二维数组
    char minesweeper[rows][columns];

    // 传递行列数和矩阵起始地址(数组名会自动 decay 为指针)
    initializeMinesWeeper(rows, columns, minesweeper);
    
    // 打印验证(临时用[i][j],后续也可替换为指针方式)
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < columns; ++j) {
            printf("%c ", minesweeper[i][j]);
        }
        printf("\n");
    }
    return 0;
}

代码说明

  1. 函数参数调整:新增rows和columns参数,用于计算元素偏移。矩阵指针用char *minesweeper接收,因为二维数组名传递时会退化为指向第一个元素的指针。
  2. 指针算术赋值:*(minesweeper + i * columns + j)直接操作内存地址,完成元素初始化。
  3. 调用方式:传递数组名minesweeper即可,它会自动转换为指向数组第一个元素的指针。

扩展提示(针对表头行/列)

如果要添加表头行和列,只需在定义矩阵时多申请一行一列(比如char minesweeper[rows+1][columns+1]),然后用同样的指针算术逻辑初始化表头部分即可——原理完全一致,只是遍历范围需要调整。

内容的提问来源于stack exchange,提问作者Ricardo Roel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:58:11