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("\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é :slight_smile:)
Em thấy có mối liên quan không hề nhẹ giữa %p%s đối với chuỗi :))

Nhờ các pro giải thích rõ ràng nhé, thanh kiu nhiều :blush:

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 :slight_smile:

Vậy câu này có đúng không anh:

?

1 Like

Hi Long Dragon.
Đúng.

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