C++传递二维char数组如何避免生成引用数组?
问题原因
C中运算符优先级里[]高于&,你写的char& currentMap[100][100]会被编译器解析为「元素类型为char引用的二维数组」,而C不允许定义引用类型的数组,因此语法报错。
你需要的是「对100*100 char类型二维数组的引用」,只需要通过括号调整优先级即可。
具体修改方案
1. 调整函数参数写法
将参数改为:char (¤tMap)[100][100]
括号将&和currentMap绑定,明确表示currentMap是一个引用,引用的对象是100行100列的char二维数组,完全符合你的传参需求。
2. 同步修改头文件的函数声明
你当前头文件里的renderScreen声明参数和定义完全不匹配,需要同步修改为和定义一致的签名:
// 头文件中修改后的函数声明 void renderScreen(char (¤tMap)[100][100], int& screenX, int& screenY);
3. 修改后的完整函数定义示例
void renderScreen(char (¤tMap)[100][100], int& screenX, int& screenY) { int xi; int yi; for (xi = 0; xi < screenX; xi++) { for (yi = 0; yi < screenY; yi++) { screen += currentMap[xi][yi]; } cout << screen << endl; screen.clear(); } }
可选替代方案
如果你不需要编译期的数组大小校验,也可以用数组退化的写法,两种写法均可正常传参调用:
- 写法1:直接写固定大小的二维数组参数,编译器会自动退化为指向数组首元素的指针
char currentMap[100][100] - 写法2:显式写指针形式
char (*currentMap)[100]
额外注意事项
你的头文件中直接定义了全局变量(如string screen;、bool quit = false;等),如果多个cpp文件包含这个头文件会触发重复定义错误,建议将全局变量的定义移到cpp文件中,头文件只保留extern声明:
// 头文件中全局变量改为声明 extern string screen; extern bool quit; extern int i; extern int j; extern int screenX; extern int screenY; extern char currentMap[100][100]; extern char currentTile;
内容的提问来源于stack exchange,提问作者Cman88
相关产品推荐
相关产品推荐

