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

如何对int指针类型的std::vector解引用以打印存储的值?

如何解引用std::vector<int*>并打印存储的值

嘿,我来帮你搞定这个问题~首先从语法上来说,你代码里写的**it其实是正确的解引用方式:第一个*用来获取迭代器指向的int*指针,第二个*再解引用这个指针拿到对应的整数数值。不过你的代码存在一个关键的逻辑bug,导致打印结果完全不符合预期,我们先解决这个问题,再确认正确的打印姿势。

原代码的核心问题

你在循环中反复把&i(也就是循环变量i的内存地址)存入vector,这意味着vector里的所有指针都指向同一个内存位置。当循环结束后,i的值已经变成了6(因为i<=5的循环执行完最后一次后,i会自增到6才退出循环),所以你打印时所有指针解引用出来的都是6,而不是你预期的1、2、3、4、5。

修正后的代码示例

要得到正确的结果,你需要为每个数值分配独立的内存空间,保证每个指针都指向不同的地址。这里提供两种常用的实现方式:

方式1:动态分配内存(注意手动释放)

#include <iostream>
#include <vector>

int main () {
    std::vector<int*> myvector;
    for (int i=1; i<=5; i++){
        // 为每个i分配新的内存空间,存入i的数值
        myvector.push_back(new int(i));
    }

    std::cout << "myvector contains:";
    // 用迭代器遍历,两次解引用拿到值
    for (std::vector<int*>::iterator it = myvector.begin() ; it != myvector.end(); ++it){
        std::cout << ' ' << **it;
    }
    std::cout << '\n';

    // 务必手动释放动态分配的内存,避免内存泄漏
    for (int* ptr : myvector) {
        delete ptr;
    }
    myvector.clear();

    return 0;
}

方式2:使用智能指针(更安全,无需手动管理内存)

如果你的项目基于C++11及以上标准,非常推荐用std::unique_ptr这类智能指针来管理内存,它会自动帮你释放内存,避免忘记释放导致的内存泄漏:

#include <iostream>
#include <vector>
#include <memory>

int main () {
    std::vector<std::unique_ptr<int>> myvector;
    for (int i=1; i<=5; i++){
        // 用make_unique创建智能指针,自动管理内存
        myvector.push_back(std::make_unique<int>(i));
    }

    std::cout << "myvector contains:";
    // 范围for循环遍历,直接解引用智能指针拿到值
    for (auto& elem : myvector){
        std::cout << ' ' << *elem;
    }
    std::cout << '\n';

    // 不需要手动释放内存,智能指针会在vector销毁时自动处理
    return 0;
}

小技巧:简化遍历代码

如果你使用C++11及以上版本,还可以用范围for循环替代迭代器遍历,让代码更简洁直观。比如对于原始的std::vector<int*>,可以这样写:

for (int* ptr : myvector) {
    std::cout << ' ' << *ptr;
}

省去了迭代器的声明代码,可读性更高。

内容的提问来源于stack exchange,提问作者Akankshi Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:02:34