Thắc mắc về con trỏ chuỗi

em vừa mới học về con trỏ nên có một chút thắc mắc

#include <iostream>

using namespace std;

int main()
{
    char *name="hello";
    cout<<&name<<"\n";
    cout<<&name[0];
    return 0;
}

đáng lẽ ra ở dòng cout<<&name[0]; phải in ra địa chỉ của kí tự ‘h’ trong chuỗi nhưng mà nó lại in ra cả cái “hello” luôn là như thế nào ạ? :’((( mọi người giúp em với

& ở đây là toán tử address-of và nó có chức năng tạo một con trỏ trỏ đến đối tượng hiện tại.
Do đó bạn cũng có thể gán cho nó như thế này

char **ptr = &name;
cout << ptr[0];

Nếu vậy ở dòng cout<<&name[0]; sẽ là: truy cập vào char * ở vị trí đầu tiên của con trỏ char **ptr (với ví dụ trên) và nó sẽ trả về char *name vì nó ở vị trí đầu tiên (toán tử [ ] subscript cũng hoạt động với con trỏ giống mảng ấy)

3 Likes

Sau khi xem lại mình thấy trường hợp trên chỉ đúng với (&name)[0] vì C++ sẽ hiểu là &(name[0]). Mình đã test với &name[1] và thấy điều này đúng khi nó in ra ello nên mình sẽ điều chỉnh cách nghĩ nó như thế này.
name[0] đúng là sẽ trả về kí tự đầu tiên là “h” kiểu dữ liệu char. Nhưng với &(name[0]) nó sẽ trả về địa chỉ của nó trong name hay char * ở vị trí 0 nên khi in nó sẽ giống với name khi bắt đầu in từ vị trí 0 đến đích. Hiểu đơn giản là nó cũng sẽ in ra giống như name nhưng bắt đầu từ 0.

2 Likes

Do name là con trỏ char*name[0]*(name + 0), *& triệt tiêu nên dòng 1 ở output là địa chỉ của biến name và dòng 2 là hello.

4 Likes

em hiểu rồi ạ, cám ơn mọi người nhiều :>>>>

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