从Strings in Depth,我了解到C ++标准没有定义字符串类的内存布局的确切实现。但是&string
和&string[0]
将如何具有不同的内存地址?
string variable("String Test");
cout << (void *) &variable << endl; // 003EFE58
cout << (void *) &variable[0] << endl; // 003EFE5C
cout << (void *) &variable[1] << endl; // 003EFE5D
... ...
但他们确实共享相同的内容,请查看:
cout << ((string)*(&variable))[0] << endl; // 'S'
cout << *(&variable[0]) << endl; // 'S'
有谁能解释这里发生了什么?
答案 0 :(得分:6)
因为一个是类实例的地址,另一个是第一个字符的地址,它通常包含在由类管理的动态分配的内存中(或者在{{3的情况下,在实例本身的某个地方) }})。
答案 1 :(得分:2)
String是一个对象。它的开头有一些领域。这是特定于实现的。在您的情况下,只有一个4字节字段。它包含的刺痛以偏移开始。实际上,sting可以在堆缓冲区中。它可能不在对象本身中。
答案 2 :(得分:0)
这恰好让许多程序员感到困惑,所以我会尽力解释它。
// here, you take the address (&) of the first item in the variable array...
// you then convert that address to a string object
// an implicit cast occure, which constructs a string instance and copies the contents of
// the referenced item in variable (which is a dereferenced char* char('S'))
// this line is similar to:
// char c = *(&variable[0]); // dereference
// string S = string(c); // copy
// printf("%c\n", S); // print
printf("%c\n", ((string)*(&variable))[0]); // 'S'
// here, you do the same dereference of the first item in variable,
// except you don't copy it into a string object
// similar to
// char c = *(&variable[0]);
// printf("%c\n", c);
printf("%c\n", *(&variable[0])); // 'S'