2013-12-20 62 views
0

我寫了一個簡單的程序來看看C++如何處理字符串對象的指針(OOP中的新對象),我驚訝地發現那個是string* as這是分配內存地址string a,沒有存儲相當於&a的值。此外,控制檯未將值打印到*as。這可能是我的最終或系統上的錯誤,或者在這裏錯過了一些基本的東西?C++字符串指針與它指向的字符串沒有相同的內存地址

#include <iostream> 
#include <string> 
using std::cout; 
using std::cin; 
using std::endl; 
using std::string; 

string a = "asdf"; 
string* as = &a; 
string* as_holder = &a; 

int main() 
{ 
    cout << "a = " << a << "\t" << "&a = " << &a << " *as = " << *as << endl 
     << "as = " << as << endl 
     << "++as = " << ++as << endl 
     << "*as = " << *as << endl << endl; 

    return 0; 
} 

輸出:

a = asdf  &a = 011ff68C *as = 
as = 011FF6A8 
++as = 011FF6A8 
*as = 
+0

請編輯您的問題以包含實際輸出。 –

+5

另請注意'++ as'和下面的'* as'會導致未定義的行爲。 –

+0

你的問題與你的代碼沒有關係,因爲你沒有顯示沒有給出正確輸出的代碼區域 – smac89

回答

4

在我的程序的有效部分的測試(的cout前兩行),打印輸出表現出相同的地址:

a = asdf &a = 0x8049c90 *as = asdf 
as = 0x8049c90 

link to a demo

然而,第三和第四行相當於未定義的行爲vior:一旦你做了++as,你就將指針移動到下一個std::string的「字符串數組」(不存在)。因此,後續嘗試解除引用as未定義的行爲

如果你想獲得一個指向您的字符串的數據,例如,你可以通過增加指針移動到下一個字符,你可以使用c_str()成員函數,就像這樣:

const char *as = a.c_str(); 
as++; 
cout << as << endl; // This would print "sdf" 
+0

c_str()到底做了什麼? – Bbvarghe

+0

@Bbvarghe'c_str()'([link to documentation](http://en.cppreference.com/w/cpp/string/basic_string/c_str))返回一個以空字符結尾的字符串表示形式的指針。 – dasblinkenlight

+0

也,作爲一個'const'仍然意味着'as'的值仍然可以被修改? – Bbvarghe