C语言中typedef定义的chessPos类型使用问题咨询
关于
typedef char chessPos[2]的正确使用指南 1. 解决scanf输入的警告问题
你的代码触发警告的原因很直接:scanf的%c格式符要求传入指向char的指针(char*),但currPos[0]是char类型的变量值,不是指针。正确写法有两种:
chessPos currPos; // 写法1:取每个元素的地址 scanf("%c%c", &currPos[0], &currPos[1]); // 写法2:利用数组名退化为指针的特性 scanf("%c%c", currPos, currPos + 1);
⚠️ 额外提醒:如果输入前有换行、空格等空白字符,建议在格式串前加空格跳过,比如" %c%c",避免读取到缓冲区残留的换行符。
2. 在函数中使用chessPos类型
作为函数参数
因为chessPos是数组类型,直接作为参数时会被编译器自动转换为指针,有两种常用写法:
- 直接用
chessPos作为参数类型(本质等价于char pos[2]或char* pos):
void printChessPos(chessPos pos) { printf("位置:%c%c\n", pos[0], pos[1]); }
调用时直接传变量名即可:
chessPos currPos = {'A', '1'}; printChessPos(currPos);
- 如果需要明确操作数组本身(避免被当作普通指针),可以用指针到数组的类型:
void modifyChessPos(chessPos *pos) { // 访问元素需要先解引用指针,再取数组下标 (*pos)[0] = 'C'; (*pos)[1] = '3'; }
调用时传入变量的地址:
modifyChessPos(&currPos);
作为函数返回值
C语言不能直接返回数组类型,但可以返回指向chessPos的指针(注意要手动管理内存):
chessPos* createChessPos(char c1, char c2) { chessPos *pos = malloc(sizeof(chessPos)); if (pos != NULL) { (*pos)[0] = c1; (*pos)[1] = c2; } return pos; }
使用后记得用free(pos)释放内存。
3. 创建并使用chessPos类型的数组
chessPos本身是数组类型,所以它的数组本质是二维数组,写法如下:
// 创建包含5个chessPos元素的数组 chessPos posArray[5]; // 赋值示例 posArray[0][0] = 'A'; posArray[0][1] = '1'; posArray[1][0] = 'B'; posArray[1][1] = '2'; // 遍历数组 for (int i = 0; i < 5; i++) { printf("第%d个位置:%c%c\n", i+1, posArray[i][0], posArray[i][1]); }
也可以在定义时直接初始化:
chessPos posArray[] = { {'A','1'}, {'B','2'}, {'C','3'} };
内容的提问来源于stack exchange,提问作者astralvampx
相关产品推荐
相关产品推荐

