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

如何通过指针在C语言函数中修改嵌套char数组

使用指针在函数中修改C语言二维字符数组

方法1:类型安全的行指针遍历

这种方法保留二维数组的类型信息,确保访问元素时符合数组维度定义,避免越界风险。

#include <stdio.h>

#define ROW 10
#define COLUMN 20

// 函数接收指向COLUMN长度字符数组的指针,以及行数
void clearMap(char (*map)[COLUMN], int rows) {
    char (*rowPtr)[COLUMN] = map; // 指向当前行的指针
    while (rowPtr < map + rows) { // 遍历所有行
        char *charPtr = *rowPtr; // 指向当前行内的字符
        while (charPtr < *rowPtr + COLUMN) { // 遍历当前行的所有字符
            if (*charPtr != '0') {
                *charPtr = ' '; // 替换非'0'字符为空格
            }
            charPtr++; // 移动到下一个字符
        }
        rowPtr++; // 移动到下一行
    }
}

int main() {
    char MAP[ROW][COLUMN] = {
        "00000000000000000000",
        "0                  0",
        "0                  0",
        "0                  0",
        "0                  0",
        "0                  0",
        "0                  0",
        "0                  0",
        "0                  0",
        "00000000000000000000",
    };

    // 调用函数完成修改
    clearMap(MAP, ROW);

    // 验证结果(可选)
    for (int y = 0; y < ROW; y++) {
        printf("%s\n", MAP[y]);
    }

    return 0;
}

方法2:扁平化指针遍历

二维数组在内存中连续存储,可将其视为一维字符数组,用单个指针遍历所有元素:

#include <stdio.h>

#define ROW 10
#define COLUMN 20

// 函数接收字符指针和总元素数
void clearMap(char *map, int totalElements) {
    char *ptr = map;
    while (ptr < map + totalElements) {
        if (*ptr != '0') {
            *ptr = ' ';
        }
        ptr++;
    }
}

int main() {
    char MAP[ROW][COLUMN] = {
        "00000000000000000000",
        "0                  0",
        "0                  0",
        "0                  0",
        "0                  0",
        "0                  0",
        "0                  0",
        "0                  0",
        "0                  0",
        "00000000000000000000",
    };

    // 调用时将二维数组转为字符指针,传入总元素数
    clearMap((char*)MAP, ROW * COLUMN);

    // 验证结果(可选)
    for (int y = 0; y < ROW; y++) {
        printf("%s\n", MAP[y]);
    }

    return 0;
}

两种方法对比

  • 方法1:类型安全,编译器会检查数组维度匹配性,适合固定维度的数组。
  • 方法2:简洁灵活,无需依赖编译期已知的列数,但需手动计算总元素数,强制类型转换会丢失类型检查,需确保内存布局正确。

内容的提问来源于stack exchange,提问作者Doğukan AL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:53:25