Một char * về cơ bản là một con trỏ trỏ đến một ký tự. Những gì C làm thường xuyên làm cho con trỏ trỏ đến ký tự đầu tiên trong một mảng.
Chuỗi std :: là một lớp giống như vectơ.Bên trong, nó xử lý việc lưu trữ một mảng các ký tự và cung cấp cho người dùng một số hàm thành viên để thao tác mảng được lưu trữ cũng như một số toán tử bị quá tải.
lý do để sử dụng một char * trên một std :: string:
C backwards-compatibility.
Performance (potentially).
char*s have lower-level access.
lý do để sử dụng một std :: string hơn một char *:
Much more intuitive to use.
Better searching, replacement, and manipulation functions.
Reduced risk of segmentation faults.
Ví dụ:
char * phải được sử dụng trong conjuction với một mảng char, hoặc với một mảng char được phân bổ động. Sau khi tất cả, một con trỏ là vô giá trị, trừ khi nó thực sự trỏ đến một cái gì đó. Điều này chủ yếu được sử dụng trong các chương trình 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"
thông báo rằng khi bạn thay đổi 'người chơi', 'ptr' cũng thay đổi. Điều này là do somebuffer là chuỗi thực tế trong trường hợp này. ptr chỉ điểm/đề cập đến nó.
Với std :: string nó ít kỳ lạ:
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")
Ở đây, bạn có thể thấy rằng việc thay đổi 'a' không ảnh hưởng 'b', vì 'b' là chuỗi thực tế. Tuy nhiên, thực sự, sự khác biệt chính là với mảng char, bạn chịu trách nhiệm quản lý bộ nhớ, trong khi std :: string thực hiện điều đó cho bạn. Trong C++, có rất ít lý do để sử dụng mảng char trên chuỗi. 99 lần trong số 100 bạn tốt hơn với một chuỗi.
Cho đến khi bạn hoàn toàn hiểu được quản lý bộ nhớ và con trỏ, chỉ cần tiết kiệm cho mình một số nhức đầu và sử dụng std :: string.
Tôi dự định gắn thẻ [C++ - Faq] này (http://stackoverflow.com/questions/tagged/c%2b%2b-faq) và sẽ thảo luận tương tự trong [C++ Lounge] (http: // chat .stackoverflow.com/phòng/10/loungec) ngay. –
Điều này vẫn đang được hỏi vào năm 2012 ?! Ngoài ra, khi nào là lời khuyên để sử dụng 'std :: string' bao giờ ** không ** kèm theo hợp lý hóa? –
@KarlKnechtel: Xin lỗi, Có vẻ tôi là một người mới sử dụng C++ không giống bạn :) Tuy nhiên, tôi sẽ bận tâm đọc toàn bộ câu hỏi và hiểu mục đích đằng sau nó thay vì chỉ đọc tiêu đề trước khi bình luận. –