& string和& string [0]的内存地址不同?

时间:2014-01-25 20:16:35

标签: c++ string

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'

有谁能解释这里发生了什么?

3 个答案:

答案 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'