Đôi khi chuỗi được khai báo bằng char s[], đôi khi bằng char *s. Có khác biệt gì không?
Có sự khác biệt. s[] là mảng, còn *s là con trỏ. Ví dụ, nếu khai báo char s[20] và char *s, dùng sizeof() sẽ cho 20 và 4. Mảng cho 20 vì chiếm 20 byte. Con trỏ cho 4 vì đó là kích thước một biến con trỏ. Với mảng, toàn bộ chuỗi lưu ở ngăn xếp (stack); với con trỏ, biến con trỏ lưu ở stack, nội dung lưu ở đoạn mã (code section). Quan trọng nhất: không thể sửa đổi chuỗi kiểu con trỏ (chỉ đọc), nhưng có thể sửa chuỗi kiểu mảng.
Ví dụ 1: Mảng (có thể sửa)
#include <stdio.h>
int main() {
char s[] = "Hello World";
s[6] = 'x'; // thử sửa ký tự vị trí 6
printf("%s", s);
return 0;
}
Kết quả
Hello xorld Sửa thành công.
Ví dụ 2: Con trỏ (chỉ đọc, gây lỗi)
#include <stdio.h>
int main() {
char *s = "Hello World";
s[6] = 'x'; // thử sửa ký tự vị trí 6
printf("%s", s);
return 0;
}
Kết quả
Segmentation Fault