01/10/2018, 08:22

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%s đối với chuỗi :))

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

Tao Không Ngu. viết 10:35 ngày 01/10/2018

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.

rogp10 viết 10:31 ngày 01/10/2018

String trong C là 1 dãy kí tự liên tục kết thúc bằng kí tự 0.

Long Dragon viết 10:24 ngày 01/10/2018

1 Vì ptr là con trỏ.

ptr nào ? Bạn giải thích sơ sài quá, không có tâm

String trong C là 1 dãy kí tự liên tục kết thúc bằng kí tự 0.

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

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ự.

?

Tao Không Ngu. viết 10:24 ngày 01/10/2018

Hi Long Dragon.
Đúng.

Bài liên quan
0