2013-03-29 50 views
6

Tôi hiểu rằngconst char * kiểu char *

char *s = "Hello World!" ; 

được lưu trữ trong bộ nhớ chỉ đọc và chuỗi chữ không thể được sửa đổi thông qua con trỏ.

Làm thế nào này khác gì so

const char *s = "Hello World!"; 

Cũng là loại 'string' char * hoặc const char *?

+0

Cách đầu tiên không được chấp nhận và nguy hiểm. – Beta

Trả lời

6

Bằng cách đưa ra các loại như const char *, nó làm cho nó khó khăn hơn để vô tình ghi đè lên bộ nhớ, vì trình biên dịch sẽ đưa ra một lỗi nếu bạn cố:

const char *s = "Hello World!"; 
s[0] = 'X'; // compile error 

Nếu bạn không sử dụng const, thì vấn đề có thể không bị bắt cho đến khi chạy, hoặc nó có thể khiến chương trình của bạn bị sai.

+0

oh có tôi thấy rằng cố gắng sửa đổi char * s, biên dịch thành công nhưng const char * s, không. Vì vậy, về cơ bản đưa const hành động một lá cờ đỏ để không thay đổi chuỗi. Mát mẻ ! – dharag

8

Sự khác biệt là sau này là hợp pháp và trước đây là không hợp pháp. Đó là một thay đổi đã được thực hiện trong C++ 11. Chính thức, "Hello World!" có loại const char[13]; nó có thể được chuyển đổi thành const char*. Trong những ngày cũ, loại của nó có thể là char[13], có thể được chuyển đổi thành char*. C++ đã thay đổi kiểu mảng bằng cách thêm const, nhưng giữ chuyển đổi thành char* để mã C hiện có sử dụng char* sẽ hoạt động trong C++, nhưng sửa đổi văn bản mà con trỏ trỏ đến hành vi không xác định được sản xuất. C++ 11 đã xóa chuyển đổi thành char*, vì vậy bây giờ bạn chỉ có thể hợp pháp làm

const char *s = "Hello world!"; 
+0

'C++ 11 đã xóa chuyển đổi thành char *' - không phải trong gcc48. Đây có phải là lỗi gcc không? –

+0

@LeonidVolnitsky - chuyển đổi không được phép trong C++ 11. Quy tắc là trình biên dịch phải đưa ra chẩn đoán cho việc vi phạm ràng buộc không có nghĩa là "không cần chẩn đoán". Vì vậy, tất cả những gì cần thiết là chẩn đoán, đôi khi là một cảnh báo. –

+0

Nếu thêm 'const' thay đổi kiểu, sẽ không' const 'hoặc' const 'hợp lý hơn? –

Các vấn đề liên quan