指针、解引用与引用:为何不同操作返回地址与字符串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
相关产品推荐
相关产品推荐

