C语言指针类型不兼容警告求助:卡牌游戏代码指针赋值报错
解决C语言中「assignment from incompatible pointer type」指针类型不兼容问题
嘿,大一计算机工程专业的同学,我来帮你搞定这个指针警告的问题!先给你拆解一下为什么会出现这个警告,再给你两种针对性的修复方案。
为什么会出现类型不兼容警告?
你定义的这些都是二维数组,而你赋值给指针变量的地址,类型和指针本身的类型完全不匹配:
- 比如
cards是const char[][30]类型,&cards[0]代表的是「指向长度为30的const char数组的指针」,具体类型是const char (*)[30],但你把它赋值给了char*类型的s1,两者类型天差地别,编译器自然会抛出警告。 - 同理,
is_it_used[][1]的&is_it_used[0]是char (*)[1],player_1_deck[7][30]的&player_1_deck[0]是char (*)[30],这些都和char*类型不兼容。
修复方案1:用指向单个字符的指针(适合访问字符串内容)
如果你只是想让指针指向二维数组里的字符串起始位置(比如要读取或修改卡牌名称),可以直接用数组的行元素赋值,同时注意cards是const类型,指针也要对应加上const:
// 先修正指针的类型声明 const char *s1; char *s2, *s3, *s4; // 直接取每行的起始地址(数组名会隐式转换为指向第一个元素的指针) s1 = cards[0]; // cards[0]是const char[30],自动转成const char* s2 = is_it_used[0]; // is_it_used[0]是char[1],自动转成char* s3 = player_1_deck[0]; s4 = player_2_deck[0];
如果需要遍历整个二维数组的所有元素,你可以通过指针偏移来实现,比如s1 += 30就能跳到下一行的起始位置(不过更推荐用下标遍历,可读性更高)。
修复方案2:用数组指针(适合操作整行数据)
如果你需要指针指向整个一维数组(比如要把某一行的卡牌数据整体复制到其他地方),那就要把指针变量声明为数组指针类型:
// 声明对应类型的数组指针 const char (*s1)[30]; // 指向长度为30的const char数组的指针 char (*s2)[1]; // 指向长度为1的char数组的指针 char (*s3)[30]; // 指向长度为30的char数组的指针 char (*s4)[30]; // 直接赋值,此时类型完全匹配 s1 = cards; // 数组名cards会隐式转成const char(*)[30],和s1类型一致 s2 = is_it_used; s3 = player_1_deck; s4 = player_2_deck;
这种情况下,你可以通过*s1来访问整个行的数组,比如strcpy(player_1_deck[0], *s1)这样的操作。
额外小建议
你的is_it_used是用来标记卡牌是否被使用的,用char[][1]有点冗余,改成int is_it_used[]或者bool is_it_used[](需要包含<stdbool.h>)会更合理,不仅节省空间,代码可读性也更高。
内容的提问来源于stack exchange,提问作者Su Başarslan
相关产品推荐
相关产品推荐

