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

为什么指针对应两个内存地址?第二个内存地址的用途是什么?

指针存在两个不同内存地址的原因及指针自身地址的使用场景

你提供的测试代码如下:

#include <iostream>
using std::cout;

int main()
{
    string animal;
    string *rabbit = &animal;
    
    cout << rabbit  << " 1st memory location \n" 
         << &rabbit << " 2nd memory location";

    return 0;
}

两个内存地址的区别

两个输出的地址对应完全不同的存储对象,本质区别如下:

  • 第一个打印的rabbit是指针变量存储的内容:它的值就是你定义的string类型变量animal的内存地址,也就是指针指向的目标内存位置,你可以通过解引用*rabbit直接读写animal的内容。
  • 第二个打印的&rabbit是指针变量自身的内存地址:指针本身也是需要占用内存空间的普通变量,和int、string这类变量的存储逻辑没有区别,只是它存储的内容是其他变量的地址,所以它本身自然也有对应的内存地址用于存储自身的值。

第二个内存地址(指针自身地址)的使用场景

指针自身的地址最常见的使用场景包括:

  • 定义二级指针(指向指针的指针),最典型的是需要在函数内部修改外部传入的指针的指向时使用。比如你需要写一个函数为外部指针分配动态内存,如果只传指针本身,函数里修改的只是指针的副本,外部指针不会生效,这时候就需要传入指针自身的地址:
// 传入二级指针才能修改外部指针本身的指向
void alloc_string(std::string** ptr) {
    *ptr = new std::string("动态分配的字符串");
}
// 调用时传入rabbit自身的地址
alloc_string(&rabbit);
  • 操作指针数组时,会需要通过指针自身的地址做偏移遍历,快速访问数组中存储的多个指针。
  • 嵌入式开发、底层内存调试、自定义内存分配器等场景下,需要手动管理内存布局、校验指针存储位置合法性时,也会需要获取指针自身的地址。

内容的提问来源于stack exchange,提问作者yui amanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:27:03