Sự khác nhau giữa char *s và char s[]

Em đang cố tìm hiểu về con trỏ, tự nhiên gặp bài khai báo chuỗi trong c như vậy:

char s[] = "Hello";

char *s = "Hello";

Ngoài việc khác nhau về size ra thì chúng còn khác nhau những gì ?
Tại sao ta không cần phải derefrence con trỏ p để lấy được chuỗi (trong trường hợp e đã tạo ra 1 char p trỏ tới s) mà ngược lại chương trình lại bị terminal ngay

biến mảng thực chất không lưu giá trị mà lưu địa chỉ của phần tử đầu tiên của cái mảng đó, cái này bạn có thể kiểm chứng bằng cách in ra địa chỉ của biến mảng đang lưu giữ:

char s[] = "Hello";
printf("%d", s); // (1)
printf("%d", &s[0]); // (2)

Khi đó, 1 và 2 sẽ giống nhau.

Do đó, ở cách thứ 2 bạn nói:

char *s = "Hello";

thực chất nó là khai báo con trỏ s trỏ tới địa chỉ của ô nhớ đầu tiên trong mảng. Note rằng: con trỏ là biến lưu trữ địa chỉ của biến cùng kiểu

2 Likes

e cũng mới tìm hiểu được là thằng

char *s = "Hello";

khi được khai báo nó sẽ nằm trong vùng read only data. Khi derefrence chỗ này thì nó sẽ lấy giá trị nằm trong ô 6c6c6548 (lleH) nên chương trình sẽ bị terminal.
Cám ơn bác

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?