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

C语言中如何创建与访问数组的数组?C99实现方法问询

C语言实现井字棋的二维数组方案

首先纠正你写的代码问题:你声明char rows[] = {first_row, second_row, third_row};是错误的,因为first_row这类数组名会隐式转换成char*(指向数组首元素的指针),所以rows的类型应该是char*[](指针数组),而不是char[]。

下面给你几种可行的实现方式,包括C99特性的用法:

1. 静态二维数组(最简单直接)

这是C里实现固定大小二维结构最常用的方式,编译时就确定数组大小,适合井字棋这种3x3固定规模的场景:

#include <stdio.h>

int main() {
    // 直接初始化3x3的二维数组,每个元素初始化为空格
    char board[3][3] = {
        {' ', ' ', ' '},
        {' ', ' ', ' '},
        {' ', ' ', ' '}
    };

    // 访问元素:行索引和列索引都从0开始
    board[0][0] = 'X'; // 第一行第一格放X
    board[1][1] = 'O'; // 中间格放O

    // 打印棋盘示例
    for (int i = 0; i < 3; i++) {
        printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
        if (i != 2) printf("---+---+---\n");
    }
    return 0;
}

访问方式和Python类似,用board[行号][列号]即可,注意C的索引从0开始。

2. 指针数组(对应你的初始思路)

如果你想把每行单独定义再组合起来,需要把rows声明为指针数组:

#include <stdio.h>

int main() {
    char first_row[] = {' ', ' ', ' '};
    char second_row[] = {' ', ' ', ' '};
    char third_row[] = {' ', ' ', ' '};
    // 声明为char*类型的数组,存储每行的指针
    char* rows[] = {first_row, second_row, third_row};

    // 访问元素
    rows[0][2] = 'X'; // 第一行第三格放X
    rows[2][0] = 'O'; // 第三行第一格放O

    // 打印棋盘
    for (int i = 0; i < 3; i++) {
        printf(" %c | %c | %c \n", rows[i][0], rows[i][1], rows[i][2]);
        if (i != 2) printf("---+---+---\n");
    }
    return 0;
}

这种方式要保证每行的长度一致,否则访问时容易出现越界问题。

3. C99变长数组(VLA,动态大小场景)

如果需要动态定义棋盘大小(比如支持nxn的井字棋变体),C99引入的变长数组可以满足需求,它允许用变量作为数组的维度:

#include <stdio.h>
#include <string.h>

int main() {
    int size = 3; // 可以改成其他整数
    // 定义变长二维数组,注意VLA不能直接初始化,需要手动赋值
    char board[size][size];

    // 把所有元素初始化为空格
    memset(board, ' ', size * size * sizeof(char));

    // 访问元素
    board[0][0] = 'X';
    board[size-1][size-1] = 'O';

    // 打印棋盘
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf(" %c ", board[i][j]);
            if (j != size-1) printf("|");
        }
        printf("\n");
        if (i != size-1) {
            for (int j = 0; j < size; j++) {
                printf("---");
                if (j != size-1) printf("+");
            }
            printf("\n");
        }
    }
    return 0;
}

变长数组是在栈上分配内存的,注意不要定义过大的VLA,避免栈溢出。

总结一下,C语言完全支持"数组的数组"(二维数组),只是语法和Python有差异,你之前的问题是类型声明错误,调整后就能正常使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:07:04