【发布时间】:2021-06-28 19:59:05
【问题描述】:
我试图了解字符串指针是如何工作的(std::string*)。
我创建了一个指向字符串的字符指针数组。出于某种原因,字符串指针指向一个地址,该地址比第一个字符的地址早 4 个地址,但是当我尊重它时它仍然打印正确的字符串(我猜它被编程为打印从它到 null0 的 4 个地址),但是为什么?为什么后面有4个地址,为什么不从第一个字符开始呢?
int main() {
std::string x = "hello";
char* ptrs[6];
for (int i = 0; i <= x.length(); i++) {
ptrs[i] = &x[i];
std::cout << (void*)ptrs[i] << " " << *ptrs[i] << "\n";
}
std::string* y = &x;
std::cout << "\n" << y << "\n";
std::cout << *y << "\n";
std::cout << (char*)y;
return 0;
}
输出:
0115F9A4 h
0115F9A5 e
0115F9A6 l
0115F9A7 l
0115F9A8 o
0115F9A9
0115F9A0
hello
ȉ2hello
【问题讨论】:
-
std::string*指向string对象的内部,而不是字符串本身。存储在哪里是私事。 -
std::string是一个内部有多个成员的对象。它与 c-string 不同。 -
@PaulSanders Private-ish。使用成员函数
.data()获取指向字符数组开头的指针。 -
请注意,如果您的编译器的
std::string类实现了短字符串优化,那么字符串字符缓冲区的位置取决于字符串字符的长度。它可能是完全存储在std::string对象本身内部的缓冲区,也可能是分配在内存中其他位置的缓冲区。所以string::data()返回的指针可以随着std::string内容的变化而随着时间的推移而变化。 -
如果你想要字符数据:
c_str()。请注意,在 C++ 中,不要只对(char*)y之类的任意转换进行打击。那是无效的。使用static_cast并密切关注编译器警告和错误。