30/09/2018, 16:00

Khai báo *& trong C++ có ý nghĩa gì?

Continuing the discussion from Tổng Hợp C,C++: Hỗ trợ giải tất cả các bài tập C & C++:

@neverbackdown9x5f

& có nghĩa là reference. Bạn xem bài
[Video] C++ Bài 42 - reference

* là con trỏ, chắc ai cũng biết rồi.
[Video] C++ Bài 19 - Con trỏ

*& có nghĩa là reference đến pointer. Mà reference cho phép thay đổi được giá trị mà nó reference tới. Vậy ở đây con trỏ có thể thay đổi được.

Xem swap by reference
[Video] C++ Bài 43 - swap by reference

Hoặc bạn có thể thử như sau:

#include <iostream>

void change_pointer(int * p)
{
    p = 0;
}

void change_pointer_by_ref(int *& p)
{
    p = 0;
}

int main()
{
    int * p = new int;
    std::cout << "p = " << p << std::endl; // 0x372160
    change_pointer(p);
    std::cout << "p = " << p << std::endl; // 0x372160
    change_pointer_by_ref(p);
    std::cout << "p = " << p << std::endl; // 0
    return 0;
}

Thử in giá trị của p sau khi sử dụng 2 hàm. Thì chỉ có hàm change_pointer_by_ref là giá trị của con trỏ p bị thay đổi thôi.

Bùi Thanh Tùng viết 18:16 ngày 30/09/2018

Mình chưa hiểu lắm nhưng so sánh *int &p với int p thì kết quả ntn nhỉ ?

Nguyễn Minh Dũng viết 18:06 ngày 30/09/2018

int *& p; khác hoàn toàn với int p; Bạn không thể so sánh được.

int *& p; là reference đến con trỏ kiểu int. Về bản chất, nó là con trỏ
int p; là biến kiểu int

Đỗ Trung Quân viết 18:15 ngày 30/09/2018

Đổi ở đây là đổi giá trị con trỏ. Vậy địa chỉ con trỏ có đổi không anh? Có nhỉ?
Theo em nhớ thì anh nói con trỏ thực chất là 1 biến bình thường lưu giữ địa chỉ của biến thông thường khác…
Giả sử con trỏ p trỏ tới a= 5, vậy giá trị của nó là địa chỉ của a?
Vậy đổi giá tri con trỏ nghĩa là chuyển địa chỉ của a sang 1 ô nhớ khác còn giá trị a vẫn bằng 5???
Hay là em hiểu sai hướng nhỉ :-?

Nguyễn Minh Dũng viết 18:02 ngày 30/09/2018

Đổi ở đây là đổi giá trị con trỏ. Vậy địa chỉ con trỏ có đổi không anh? Có nhỉ?

Em cho ví dụ đổi, anh sẽ giải thích.

Theo em nhớ thì anh nói con trỏ thực chất là 1 biến bình thường lưu giữ địa chỉ của biến thông thường khác…

Đúng

Giả sử con trỏ p trỏ tới a= 5, vậy giá trị của nó là địa chỉ của a?

Đúng

Vậy đổi giá tri con trỏ nghĩa là chuyển địa chỉ của a sang 1 ô nhớ khác còn giá trị a vẫn bằng 5???

Đổi giá trị của con trỏ có nghĩa là thay vì trỏ tới a, con trỏ trỏ tới ô khác, a vẫn bằng 5. Chứ không phải chuyển địa chỉ của a.

Đỗ Trung Quân viết 18:16 ngày 30/09/2018

Đổi giá trị của con trỏ có nghĩa là thay vì trỏ tới a, con trỏ trỏ tới ô khác, a vẫn bằng 5. Chứ không phải chuyển địa chỉ của a.

int a =5,b =3;
int * c = &a;
std::cout<<"&a ="<<&a<<std::endl;
std::cout<<"a  ="<<a<<std::endl; // a =5
std::cout<<"c  ="<<c<<std::endl; // c= &a

*&c = &b;
a = *c; 
std::cout<<"*&c = &b ="<<c<<std::endl; // c = &b
std::cout<<"a  ="<<a<<std::endl;  // a= 3
std::cout<<"&a ="<<&a<<std::endl;
Đỗ Trung Quân viết 18:06 ngày 30/09/2018

Em cho ví dụ đổi, anh sẽ giải thích

Đó anh. Em đổi thấy giá trị con trỏ c thay đổi chứ địa chỉ con trỏ kiểm tra thế nào? Gán nó = 1 con trỏ khác?

Nguyễn Minh Dũng viết 18:13 ngày 30/09/2018

Con trỏ em để ý tới 2 thứ. Một là giá trị nó đang giữ. Và địa chỉ của chính nó.

để lấy được địa chỉ của nó đang giữ:
p

để lấy được giá trị của địa chỉ của nó đang giữ:
*p

để lấy được địa chỉ của chính nó
&p

Vậy *&p trong C có nghĩa là gì? Trước hết &p có nghĩa là địa chỉ của p.
Vậy *(địa chỉ của p) tức là giá trị của địa chỉ của p. Tức là địa chỉ mà p đang giữ.
Suy ra *&p == p

Bùi Thanh Tùng viết 18:15 ngày 30/09/2018

Cái này dễ hiểu này

Đỗ Trung Quân viết 18:07 ngày 30/09/2018

Cái này dễ hiểu này

Dùng được hay không mới là vấn đề :))

Bùi Thanh Tùng viết 18:09 ngày 30/09/2018

Chăm chỉ thực hành thì biết ngay cái vấn đề dùng được hay không ý mà

Hải Tô Ngọc viết 18:08 ngày 30/09/2018

Cho e hỏi vì sao phép gán
Int a,*p;
Biểu thức *p +1 = a; sai vậy?

rogp10 viết 18:08 ngày 30/09/2018

Vì *p +1 là một giá trị, nên không thể gàn được. Đừng lầm với *(p+1) là một slot mem và gán được.

Bài liên quan
0