C语言中对char*变量s直接取值和取&s为何得到不同指针地址
问题解答
核心概念区分
你产生疑惑的根本原因是混淆了指针变量自身的存储地址和指针变量中存储的指向目标的地址:
你定义的char *s = "ABCDEF";实际对应两层存储逻辑:
- 字符串常量
"ABCDEF"存储在进程的只读数据段,首地址为0x400634 s是一个存放在栈区的char*类型指针变量,它的作用是存储上面这个字符串常量的首地址,这个指针变量本身在栈上的存储地址为0x7ffd95c33090
逐个解释打印结果
- 打印
s:输出的是指针变量s中存储的内容,也就是字符串常量的首地址,结果为0x400634 - 打印
&s:&是取变量地址运算符,这里取的是栈区上的指针变量s自身的存储地址,结果为栈区地址0x7ffd95c33090 - 打印
y:你定义char **y = &s;就是将s的自身地址赋值给二级指针y,因此y存储的内容就是s的地址,和&s输出完全一致 - 打印
&s[0]:数组下标运算优先级高于取地址运算符,先执行s[0]拿到s指向的字符串的第一个字符'A',再对这个字符取地址,得到的就是字符串首字符的地址,和s中存储的内容完全一致,因此和s输出结果相同
常见误区说明
你提到的“两个操作都是获取字符串首字符的地址”是错误的:&s的操作目标是指针变量s本身,和s指向的字符串没有任何关系,两者属于完全不同的内存区域,所以输出结果自然不同。
可以用通俗的场景类比理解:你有一个记事本(对应指针变量s,放在你家的抽屉里),记事本上写着图书馆某座位的编号(对应字符串常量的首地址)。你看记事本上的内容得到的是图书馆座位号(对应s的值),你问记事本放在哪得到的是你家抽屉的位置(对应&s的值),两个地址当然不可能一样。
内容的提问来源于stack exchange,提问作者Will Felipe
相关产品推荐
相关产品推荐

