Zeiger auf const char vs char-Array vs std :: string

8

Hier habe ich zwei Zeilen Code

%Vor%

Beide Codezeilen haben das gleiche Verhalten, daher kann ich keinen Unterschied erkennen, ob ich s1 über s2 oder umgekehrt vorziehen sollte. Zusätzlich zu s1 und s2 gibt es auch die Möglichkeit, std::string zu verwenden. Ich denke, die Art, std :: string zu verwenden, ist die eleganteste. Während ich anderen Code betrachte, sehe ich oft diese Leute entweder use const char * oder char s [] . Also, meine Frage ist jetzt, wann sollte ich const char * s1 oder char s [] oder std::string verwenden? Was sind die Unterschiede und in welchen Situationen sollte ich welchen Ansatz verwenden?

    
System.Data 22.02.2012, 10:44
quelle

7 Antworten

9
%Vor%

Diese beiden sind nicht identisch. s1 ist unveränderlich: Es zeigt auf konstanten Speicher. Das Ändern von Zeichenfolgenliteralen ist ein nicht definiertes Verhalten.

Und ja, in C ++ sollten Sie std::string bevorzugen.

    
Luchian Grigore 22.02.2012, 10:47
quelle
9
%Vor%     
quelle
3

Der erste ist konstant, der zweite nicht. std :: string ist ein Klassentyp und implementiert viele nützliche Funktionen und Methoden für die String-Manipulation, was es viel einfacher und benutzerfreundlicher macht. Die c-style 'strings' mit char-Zeigern sind schwer zu kontrollieren, zu manipulieren und verursachen oft Fehler, haben aber nicht den Overhead von std :: string. Im Allgemeinen ist es besser, sich an die std :: strings zu halten, da sie einfacher zu pflegen sind.

    
Alexander 22.02.2012 10:49
quelle
3

Der einzige Unterschied zwischen den beiden, den Sie beachten sollten, ist dies:

Welche verwendet Ihr Projekt bereits?

    
x10 22.02.2012 10:50
quelle
3

Diese beiden tun nicht haben das gleiche Verhalten. s1 ist ein einfacher Zeiger, der initialisiert wird, um auf einen (normalerweise nur lesbaren) Bereich des Speichers zu zeigen. s2 dagegen definiert ein lokales Array der Größe 5 und füllt es mit einer Kopie dieser Zeichenfolge.

Formal ist es nicht erlaubt, s1 zu ändern, also etwas wie s1[0] = 'a' . Insbesondere unter seltsamen Umständen könnte es dazu führen, dass alle anderen "test" s in Ihrem Programm "aest" werden, weil sie alle den gleichen Speicher teilen. Dies ist der Grund, warum moderne Compiler schreien, wenn Sie

schreiben %Vor%

Andererseits ist das Ändern von s2 erlaubt, da es sich um eine lokale Kopie handelt.

Mit anderen Worten, im folgenden Beispiel

%Vor%

s1 und s2 können sehr gut auf dieselbe Adresse im Speicher verweisen, während s3 und s4 zwei verschiedene Kopien derselben Zeichenfolge sind und sich in verschiedene Speicherbereiche.

Wenn Sie C ++ schreiben, verwenden Sie std::string , es sei denn, Sie benötigen unbedingt ein Array von Zeichen. Wenn Sie ein veränderbares Array von Zeichen benötigen, verwenden Sie char s[] . Wenn Sie nur eine unveränderliche Zeichenfolge benötigen, verwenden Sie const char* .

    
user1071136 22.02.2012 10:55
quelle
0

Verwenden Sie std::string , es sei denn, Sie wissen , warum Sie ein Char-Array / Zeiger auf char benötigen.

    
DevSolar 22.02.2012 10:52
quelle
0

Welches zu verwenden ist, hängt von Ihrer Anforderung ab. Pointer bietet Ihnen mehr Flexibilität. und in einigen Fällen Vulnerabilität. Strings sind eine sichere Option und sie bieten Iterator-Unterstützung.

    
Rohit Vipin Mathews 22.02.2012 10:50
quelle

Tags und Links