Un char * es básicamente un puntero a un personaje. Lo que C hace con frecuencia hace que este puntero apunte al primer carácter de una matriz.
Una std :: string es una clase que se parece mucho a un vector.Internamente, maneja el almacenamiento de una matriz de caracteres, y le da al usuario varias funciones miembro para manipular dicha matriz almacenada, así como varios operadores sobrecargados.
razones para utilizar un char * sobre un std :: string:
C backwards-compatibility.
Performance (potentially).
char*s have lower-level access.
razones para utilizar un std :: string en un char *:
Much more intuitive to use.
Better searching, replacement, and manipulation functions.
Reduced risk of segmentation faults.
Ejemplo:
char * se debe usar junto con una matriz char o con una matriz char asignada dinámicamente. Después de todo, un puntero es inútil a menos que realmente apunte a algo. Esto se usa principalmente en programas C:
char somebuffer[100] = "a string";
char* ptr = somebuffer; // ptr now points to somebuffer
cout << ptr; // prints "a string"
somebuffer[0] = 'b'; // change somebuffer
cout << ptr; // prints "b string"
, tenga en cuenta que cuando cambie 'somebuffer', 'ptr' también cambiará. Esto se debe a que somebuffer es la cadena real en este caso. ptr just points/se refiere a eso.
Con std :: string es menos raro:
std::string a = "a string";
std::string b = a;
cout << b; // prints "a string"
a[0] = 'b'; // change 'a'
cout << b; // prints "a string" (not "b string")
Aquí, se puede ver que el cambio 'a' no afecta 'b', porque 'b' es la cadena real.
Pero en realidad, la principal diferencia es que con las matrices de caracteres, usted es responsable de administrar la memoria, mientras que std :: string lo hace por usted. En C++, hay muy pocas razones para usar matrices de caracteres sobre cadenas. 99 veces de cada 100 estás mejor con una cuerda.
Hasta que comprenda completamente la administración de la memoria y los indicadores, simplemente ahórrese algunos dolores de cabeza y use std :: string.
Planeo etiquetar esto [C++ - Faq] (http://stackoverflow.com/questions/tagged/c%2b%2b-faq) y discutiré lo mismo en [C++ Lounge] (http: // chat .stackoverflow.com/rooms/10/loungec) en breve. –
¡¿Esto todavía se está preguntando en 2012 ?! Además, ¿cuándo está el consejo de usar 'std :: string' alguna vez ** no ** acompañado de racionalización? –
@KarlKnechtel: Lo siento, parece que soy un novato en C++ a diferencia de ti :) Sin embargo, me molestaría en leer toda la pregunta y entender el propósito detrás de ella en lugar de solo leer el título antes de comentar. –