Không hiểu về con trỏ

Chào mấy anh chị, em đang tìm hiểu về con trỏ.

Tình hình là em không hiểu sao s3 là con trỏ tức bản thân nó mang địa chỉ vùng nhớ, trong vùng nhớ đó mới chứa chuỗi “heroine”. Vậy mà kết quả dòng lệnh sau in ra màn hình là “heroine” luôn ạ, mà không phải là địa chỉ (004FF70C chẳng hạn.).

char *s3 = "heroine";
cout << "The C-style string s3 = " << s3 << "." << endl;

&s3
(dòng này klq, đủ 20 char)

^ phải là (void*) s3. https://repl.it/repls/EssentialHarshArchitects

Vì quy định char* là một chuỗi, nên operator<<(istream, char*) phải ra một chuỗi.

4 Likes

à vâng. Vậy char* lúc này cũng như std::string vậy hả bác?, chứ nó không phải là kiểu con trỏ ??

Lí do lịch sử :slight_smile:

C không có kiểu chuỗi riêng biệt mà sử dụng luôn char* để trỏ vào một chuỗi kết thúc bằng byte 0x00 (xem <string.h>). Vì vậy operator<<(istream, char*) được quy ước là xuất nội dung của nó.

4 Likes

hơi ngoằn ngoèo nhỉ :grinning: Nhưng mà tóm lại là char* vừa có tác dụng trỏ vào chuỗi, vừa có tác dụng xuất chính nội dung vùng nhớ nó trỏ đến nhỉ??
Nhưng như vậy thì em thắc mắc nếu mình muốn in ra màn hình địa chỉ thì làm sao ạ bác??

char a='h';
char *s3;
s3=&a;
    
cout << "s3 address = " << &s3 << "." << endl;
cout << "s3 value = " <<(void*) s3 << "." << endl;
cout << "a address = " <<(void*) &a << "." << endl;

Bạn có thể đọc thêm ở:

Về cơ bản, toán tử ‘<<’ đã được lập trình để khi nhận được biến kiểu *char thì nó sẽ đọc đến khi gặp giá trị ‘\0’ (vì sử dụng char* là cách thường dùng để đựng chuỗi). Để in được địa chỉ, bạn phải ép kiểu cho biến đó
thành void* để có thể sử dụng như bình thường (thêm (void*) phía trước) . biến char* của bạn có chứa chuỗi hay ký tự char thì đều dùng cách này được.

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