char* в основном является указателем на символ. То, что делает C, часто заставляет этот указатель указывать на первый символ в массиве.
std::string — это класс, очень похожий на вектор. Внутри он обрабатывает хранение массива символов и предоставляет пользователю несколько функций-членов для управления указанным сохраненным массивом, а также несколько перегруженных операторов.
Причины использовать char* вместо std::string:
C backwards-compatibility.
Performance (potentially).
char*s have lower-level access.
Причины использовать std::string вместо char*:
Much more intuitive to use.
Better searching, replacement, and manipulation functions.
Reduced risk of segmentation faults.
Пример :
char* должен использоваться в сочетании либо с массивом символов, либо с динамически выделяемым массивом символов. В конце концов, указатель бесполезен, если он на самом деле не указывает на что-то. Это в основном используется в программах 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"
обратите внимание, что когда вы меняете 'somebuffer', 'ptr' также меняется. Это связано с тем, что в этом случае somebuffer является фактической строкой. ptr просто указывает/ссылается на него.
С std::string это менее странно:
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")
Здесь вы можете видеть, что изменение «a» не влияет на «b», потому что «b» — это фактическая строка.
Но на самом деле главное отличие состоит в том, что с массивами char вы отвечаете за управление памятью, тогда как std::string делает это за вас. В C++ очень мало причин использовать массивы символов вместо строк. В 99 случаях из 100 вам лучше использовать строку.
Пока вы полностью не разберетесь в управлении памятью и указателях, просто избавьте себя от головной боли и используйте std::string.
person
SandBag_1996
schedule
10.08.2012
std::string
всегда не сопровождается рационализацией? - person Karl Knechtel   schedule 05.04.2012