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

指针、解引用与引用:为何不同操作返回地址与字符串hello?

为啥同一个指针操作会出两种结果?

兄弟,这事儿本质是指针的「双重身份」在作祟——它既是一个有自己内存地址的变量,又是一个存储着其他内存地址的指向器,我给你拆解得明明白白:

核心逻辑:指针的两个关键属性

指针本身就是个普通变量,只不过它存的不是数字、字符这种数据,而是另一块内存的地址。所以它有两个核心信息:

  • 它自己在内存里的位置(也就是你看到的「指针的地址」)
  • 它指向的内存区域里的内容(也就是输出"hello"的原因)

举个最常见的C语言例子

看这段代码,你就能瞬间懂:

#include <stdio.h>
int main() {
    char *ptr = "hello";  // ptr是指针变量,存着"hello"首字符的内存地址
    
    // 操作1:获取指针自己的地址
    printf("指针自身的地址:%p\n", &ptr);  
    // 操作2:获取指针指向的内容
    printf("指针指向的内容:%s\n", ptr);  
    return 0;
}

逐个解释操作:

  • 当你用&ptr时,你取的是指针变量ptr本身在内存中的地址——就像你给int变量取地址一样,这是ptr自己的“内存住址”。
  • 当你直接用ptr时,它会被解析成它存储的那个地址(也就是"hello"首字符的地址),配合%s格式符,程序会从这个地址开始读取字符,直到遇到字符串结束符\0,自然就输出"hello"了。

再补个C++的场景(如果是用cout的话)

要是你用C++的cout输出,逻辑也是一样的:

#include <iostream>
using namespace std;
int main() {
    char *ptr = "hello";
    cout << &ptr << endl;  // 输出指针自己的地址
    cout << ptr << endl;   // 输出"hello"
}

这里cout对char*做了特殊重载:直接输出char*指针时,会自动打印它指向的字符串;而取指针的地址&ptr,输出的就是指针变量自身的内存地址。

一句话总结

你执行的两个操作,本质是在访问指针的两个不同层面:一个是指针变量本身(取它的地址),另一个是指针指向的目标内存(读取里面的字符串)。把这俩概念掰清楚,这种现象就完全合理啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:14:53