2014-01-25 73 views
1

Strings in Depth,我瞭解到,字符串類的內存佈局的確切實現不是由C++標準定義的。但是&string&string[0]怎麼會有不同的內存地址?&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' 

誰能解釋這是怎麼回事呢?

+5

'string'不是數組類型,它是一個類類型。如果你聲明瞭一個'char'數組,這將會像預期的那樣工作。 – 2014-01-25 20:20:29

+0

@ H2CO3正確,同意,因爲printf –

+0

@GrijeshChauhan正確,同意,刪除** No!** op請求'std :: string' ... –

回答

6

因爲一個是類實例的地址,另一個是第一個字符的地址,它通常包含在由該類管理的動態分配內存中(或者在實例本身的某個地方,在SSO的情況下) 。

2

字符串是一個對象。它在開始時有一些領域。這是特定於實現的。在你的情況下,只有一個4字節的字段。它包含的刺痛以偏移量開始。事實上,刺可以在堆緩衝區中。它可能不在對象本身中。

+3

這不是說「它有一些領域的開始」。數組通常是動態分配的,所以實際上只有一個指向其他(完全不相關的)內存塊的指針。 – 2014-01-25 20:23:06

+0

是的。這是99%的情況。我應該不相信原始文章中的列表嗎?也許原因仍然需要。 –

+0

不一定。事實上,誰知道具有'std :: string'內在函數的現代優化編譯器可能會使用從字符串文字構造的字符串實例。 (例如把它變成一個包含自動數組而不是動態分配指針的結構......) – 2014-01-25 20:26:12

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' 
+1

我想你誤解了第一個,它是'((string)*(&variable))[0]'not'((string)*(&variable [0]))''。 – herohuyongtao

+0

是的,你是對的。對不起,我的眼睛被壓迫了......:/ –

相關問題