2016-10-15 9 views
-2

Okay, ich versuche, ein Problem, herauszufinden, wenn ich diesen Code unten versuchen:Warum wird char * nicht in den Vektor kopiert, aber die Zeichenfolge wird kopiert?

#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; 
} 

Dies ist die Ausgabe die ich erhielt:

Enter Values : 
aaaa 
ssss 
ddddd 
ffff 
errrr 



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

Aber jetzt änderte ich "char *" zu "string":

#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; 
} 

Nun, speichert er alle von ihm in den Vektor:

Enter Values : 
aaaa 
ssss 
ddddd 
ffff 
errrr 



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

Meine Frage, warum char * nicht im Vektor gespeichert wird, aber Zeichenfolge im Vektor gespeichert wird?

+1

'char *' ist nur ein Zeiger, während 'std :: string' eine Klasse ist. Arrays werden nicht automatisch kopiert. –

Antwort

3

Da ein Vektor von char * Zeichenzeiger speichert (Speicheradressen des ersten Zeichens Ihres Zeichenarrays s), nicht die Zeichen selbst. Der einzige Ort, an dem die Zeichen gespeichert werden, ist Ihr Array selbst. Aber das wird ständig durch die < < überschrieben. Da s nur einmal definiert ist, hat es nur eine eindeutige Adresse und Ihr gesamter Vektor enthält nur Zeiger mit demselben Adresswert.

Beachten Sie, dass in C++ der Name eines Arrays (auch ein char-Array) in einen Zeiger auf sein erstes Element konvertiert wird.

+2

"Beachten Sie, dass in C++ der Name eines Arrays (auch ein Char-Array) ein Zeiger auf sein erstes Element ist" Nein. Es wird in den meisten Kontexten in einen solchen Zeiger konvertiert, aber es ist nicht das Gleiche. – davmac

+0

Danke, scheint, ich bin hier etwas zu lernen. Konvertiert wie in "Wert geändert im Speicher" oder "Typ interpretiert anders"? –

+1

Es wird nach der Konvertierung einen anderen Wert und einen anderen Typ haben. Nichts im Speicher wird notwendigerweise geändert, da das Ergebnis des Werts kein Lvalue ist. Das einfachste Beispiel für die Unterscheidung ist 'sizeof':' sizeof (arrayname) 'gibt die Größe des _whole_ array an; Wenn 'arrayname' ein Zeiger wäre, würde er die Größe eines Zeigers ergeben. Also bezieht sich 'arrayname' tatsächlich auf das gesamte Array; Es wird in einen Zeiger dieses Arrays konvertiert, wenn Sie es in einem Kontext verwenden, der dies erfordert (gemäß den Sprachregeln). (In diesem Fall bedeutet "konvertiert" nicht, dass das Original geändert wird). – davmac

Verwandte Themen