You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义指针数组并访问?为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:07:07