如何定义指针数组并访问?为何enemy1与enemies[0]地址不同?
问题原因
你遇到的地址不一致问题,核心是数组存储的是指针的副本:
- 如果代码执行顺序是先初始化
enemies数组,再给enemy1分配内存(也就是enemy1 = new enemy(...)在数组初始化之后),那enemies[0]保存的是enemy1未赋值前的旧值(局部变量为野指针,全局变量为nullptr),后续enemy1被赋值新的堆地址后,自然和enemies[0]地址不同。 - 就算先给
enemy1赋值再初始化数组,之后单独修改enemy1的指向时,enemies[0]也不会同步变化——因为数组里存的是独立副本,不是指针的引用。
另外看你循环逻辑:若enemies[0]初始为空(比如数组初始化在enemy1赋值前),循环会给enemies[0]分配新对象,此时enemies[0]和enemy1指向不同的堆地址,自然不一致。
修改方案
要让enemy1和enemies[0]始终指向同一对象,有两种实用方式:
方式1:使用二级指针数组(保留单独的enemy1-enemy5变量)
把数组定义为存储指针的指针,让数组元素和单独的指针变量指向同一个指针地址,这样修改其中一个,另一个会同步变化:
// 定义一级指针并初始化第一个敌人 enemy* enemy1 = nullptr; enemy* enemy2 = nullptr; enemy* enemy3 = nullptr; enemy* enemy4 = nullptr; enemy* enemy5 = nullptr; enemy1 = new enemy(enemypic[0], 100, 400, 494, 454, 0.1, 0.1, 10, attack[0], blood[0]); // 定义二级指针数组,存储每个一级指针的地址 enemy** enemies[] = { &enemy1, &enemy2, &enemy3, &enemy4, &enemy5 }; // 访问时需解引用二级指针 for (int i = 0; i < 5; i++) { cout << i << endl; cout << enemy1 << endl; cout << *enemies[i] << endl; // 解引用后得到和enemy1一致的地址 if (!(*enemies[i])) { *enemies[i] = new enemy(enemypic[i], 100, 400, 494, 454, 0.1, 0.1, 10, attack[0], blood[0]); } }
方式2:直接用数组管理所有敌人指针(放弃单独变量)
如果不需要单独的enemy1到enemy5变量,直接通过数组初始化和访问敌人,更简洁且避免同步问题:
// 定义指针数组并初始化 enemy* enemies[5] = {nullptr}; // 先统一初始化为空指针 for (int i = 0; i < 5; i++) { // 第一个敌人用特定参数,其余按需调整 if (i == 0) { enemies[i] = new enemy(enemypic[0], 100, 400, 494, 454, 0.1, 0.1, 10, attack[0], blood[0]); } else { enemies[i] = new enemy(enemypic[i], 100, 400, 494, 454, 0.1, 0.1, 10, attack[0], blood[0]); } } // 访问第一个敌人直接用enemies[0],和原enemy1功能一致 cout << enemies[0] << endl;
额外注意
- 局部指针变量未初始化时是野指针,会引发未定义行为,建议定义时就初始化为
nullptr。 - 游戏结束后务必遍历数组,释放所有
new出来的敌人对象,避免内存泄漏。
内容的提问来源于stack exchange,提问作者susanliu
相关产品推荐
相关产品推荐

