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 referenceHoặ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.
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ỉ ?
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
Đổ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ỉ :-?
Em cho ví dụ đổi, anh sẽ giải thích.
Đúng
Đúng
Đổ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.
Đó 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?
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
Cái này dễ hiểu này
Dùng được hay không mới là vấn đề :))
Chăm chỉ thực hành thì biết ngay cái vấn đề dùng được hay không ý mà
Cho e hỏi vì sao phép gán
Int a,*p;
Biểu thức *p +1 = a; sai vậy?
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.