Bản chất thật sự của string trong C?
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("
Address of string: %p", &str);
printf("
Address of first character: %p", &str[0]);
printf("
Address of second character: %p", &str[1]);
printf("
Address of third character: %p", &str[2]);
printf("
Address of fourth character: %p", &str[3]);
printf("
Address of fifth character: %p", &str[4]);
return 0;
}
hoặc
int main()
{
char str[] = "Hello";
printf("String: %s", str);
printf("
Address of string: %p", str);
printf("
Address of first character: %p", str);
printf("
Address of second character: %p", str + 1);
printf("
Address of third character: %p", str + 2);
printf("
Address of fourth character: %p", str + 3);
printf("
Address 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
Hi Long Dragon.
1 Vì ptr là con trỏ.
2 Vì hàm printf có định danh chuyền vào.
http://en.cppreference.com/w/c/variadic
3 Bạn xem lai phép toán trên contror.
String trong C là 1 dãy kí tự liên tục kết thúc bằng kí tự 0.
ptr nào ? Bạn giải thích sơ sài quá, không có tâm
Vậy câu này có đúng không anh:
?
Hi Long Dragon.
Đúng.