Em có biết được là string trong C bản chất là 1 array chứa các ký tự, hay nói đúng hơn là những ô nhớ liên tiếp trong bộ nhớ được quản lý bởi con trỏ đứng ở ô đầu tiên, mỗi ô có content là 1 ký tự.
VD:
int main()
{
char str[] = "Hello";
printf("String: %s", str);
printf("\nAddress of string: %p", &str);
printf("\nAddress of first character: %p", &str[0]);
printf("\nAddress of second character: %p", &str[1]);
printf("\nAddress of third character: %p", &str[2]);
printf("\nAddress of fourth character: %p", &str[3]);
printf("\nAddress of fifth character: %p", &str[4]);
return 0;
}
hoặc
int main()
{
char str[] = "Hello";
printf("String: %s", str);
printf("\nAddress of string: %p", str);
printf("\nAddress of first character: %p", str);
printf("\nAddress of second character: %p", str + 1);
printf("\nAddress of third character: %p", str + 2);
printf("\nAddress of fourth character: %p", str + 3);
printf("\nAddress of fifth character: %p", str + 4);
return 0;
}
Kết quả:

=> Chúng là những ô nhớ liên tiếp !
Nhưng vẫn chưa thể hiểu 1 số vấn đề như sau:
char str[50];
scanf("%s", str);
printf("%s", str);
Ở đoạn code trên, trong hàm printf(), khi để str không và đặc tả là %p thì sẽ in ra địa chỉ của ô nhớ (ký tự) đầu tiên trong chuỗi str, nhưng nếu trong cặp ngoặc kép để đặc tả là %s thì lại in ra nguyên cả chuỗi đó, vì sao ?
và khi xuất ra thêm:
printf("%s", str + 4);
thì chương trình xuất ra cái chuỗi đó nhưng mất đi 4 ký tự ở đầu chuỗi, vì sao ? (nhờ các pro nói rõ cơ chế hoạt động, có kèm theo hình ảnh minh họa càng tốt nhé
)
Em thấy có mối liên quan không hề nhẹ giữa %p và %s đối với chuỗi :))
Nhờ các pro giải thích rõ ràng nhé, thanh kiu nhiều 

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