为什么地址不一样?

bab*_*ain 1 c++ pointers stdstring memory-address

为了理解指针,我编写了下面的代码。

#include <cstdio>
#include <iostream>
using namespace std;

int main() {
    string a = "hello";
    const char *st = &a[0];
    printf("%p\n", &st[0]);
    printf("%p\n", &(a[0]));
    printf("%c\n", *st);
    printf("%p", &a);
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出

0x1265028
0x1265028
h
0x7ffe26a91c40
Run Code Online (Sandbox Code Playgroud)

如果我的理解是正确&a的应该返回字符串的地址,为什么返回的值与&a其余的不同?

Jer*_*ner 13

Astd::string是一个 C++ 对象,它内部保存一个指向chars 数组的指针。

在您的代码中,st是指向该内部数组中第一个字符的指针,而&a是指向 C++ 对象的指针。它们是不同的东西,因此指针值也不同。


phu*_*clv 6

&aa是类型变量的地址std::string。由于std::string包含可变长度的字符数组,因此它必须使用动态分配并将真实数组存储在其他地方。

然而,std::string有许多运算符重载。返回对 的数组a[0]中第一个字符的引用,并且是该字符的地址。这就是为什么和是相同的地址,as也指向数组中的第一个字符。a&a[0]&st[0]&a[0]sta