为什么指针对应两个内存地址?第二个内存地址的用途是什么?
指针存在两个不同内存地址的原因及指针自身地址的使用场景
你提供的测试代码如下:
#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
相关产品推荐
相关产品推荐

