2016-10-15 39 views
-2

好吧,我想弄清楚一個問題,當我嘗試下面這段代碼:char *爲什麼不復制到矢量中但字符串被複制?

#include <iostream> 
#include <vector> 
#include <stdint.h> 
#include <string> 
#include <Windows.h> 
using namespace std; 

int main(){ 
    vector<char*> v; 
    char s[10]; 
    std::cout << "Enter Values :\n"; 
    for (int i = 0; i<5; i++){ 
     cin >> s; 
     v.push_back(s); 
    } 

    std::cout << "\n\n\nPrinted Values :\n"; 
    for (auto ss : v){ 
     cout << ss << "\n"; 
     cout << "------------\n"; 
    } 
    system("pause"); 
    return 0; 
} 

這是我收到的輸出:

Enter Values : 
aaaa 
ssss 
ddddd 
ffff 
errrr 



Printed Values : 
errrr 
------------ 
errrr 
------------ 
errrr 
------------ 
errrr 
------------ 
errrr 
------------ 

但現在我改變了「字符*」以 「串」:

#include <iostream> 
#include <vector> 
#include <stdint.h> 
#include <string> 
#include <Windows.h> 
using namespace std; 

int main(){ 
    vector<string> v; 
    string s; 
    std::cout << "Enter Values :\n"; 
    for (int i = 0; i<5; i++){ 
     cin >> s; 
     v.push_back(s); 
    } 

    std::cout << "\n\n\nPrinted Values :\n"; 
    for (auto ss : v){ 
     cout << ss << "\n"; 
     cout << "------------\n"; 
    } 
    system("pause"); 
    return 0; 
} 

現在,它存儲所有的入載體:

Enter Values : 
aaaa 
ssss 
ddddd 
ffff 
errrr 



Printed Values : 
aaaa 
------------ 
ssss 
------------ 
ddddd 
------------ 
ffff 
------------ 
errrr 
------------ 

我的問題是,爲什麼char *沒有存儲在向量中,但字符串存儲在向量中?

+1

'char *'只是一個指針,而'std :: string'是一個類。數組不會自動複製。 –

回答

3

由於char *向量將存儲字符指針(字符數組的第一個字符的存儲器地址),而不是字符本身。存儲字符的唯一地方就是你的數組本身。但是這不斷被< <覆蓋。由於s只定義了一次,它只有一個唯一的地址,並且整個向量只包含具有相同地址值的指針。

請注意,在C++中,數組的名稱(也是char數組)被轉換爲指向其第一個元素的指針。

+2

「請注意,在C++中,數組的名稱(也是一個char數組)是一個指向其第一個元素的指針」不。它在大多數上下文中被轉換爲這樣一個指針,但它不是一回事。 – davmac

+0

謝謝,看來我正要在這裏學習一些東西。轉換爲「內存中更改的值」或「類型解釋不同」? –

+1

轉換後它將具有不同的值和不同的類型。由於值的結果不是左值,內存中的任何內容都不一定會改變。差異化的最簡單的例子是'sizeof':'sizeof(arrayname)'給出_whole_數組的大小;如果'arrayname'是一個指針,那麼它會給出一個指針的大小。所以'arrayname'實際上是指整個數組;如果你在需要的上下文中使用它(根據語言規則),它將被轉換爲數組的指針。 (在這種情況下,「轉換」並不意味着原來的內容被改變了)。 – davmac