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
相关产品推荐
相关产品推荐

