tôi muốn chia sẻ một kỹ thuật chung mà tôi sử dụng để học cách con trỏ làm việc khi tôi đã bắt đầu. Nếu bạn áp dụng nó cho vấn đề của mình, bạn sẽ thấy câu trả lời đơn giản như ngày.
Lấy một tờ giấy lớn và đặt nó dọc theo chiều dài trên bàn trước mặt bạn. Đây là bộ nhớ máy tính của bạn. Mỗi hộp đại diện cho một byte. Chọn một hàng và đặt số '100' bên dưới hộp ở phía xa bên trái. Đây là "địa chỉ thấp nhất" của bộ nhớ. (Tôi đã chọn 100 là số tùy ý không phải là 0, bạn có thể chọn số khác.) Đánh số các ô theo thứ tự tăng dần từ trái sang phải.
+---+---+---+---+---+--
| | | | | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Bây giờ, chỉ trong giây lát, giả vờ một kích thước là một byte. Bạn là một máy tính tám bit. Viết số int a
của bạn vào một trong các hộp. Số bên dưới hộp là địa chỉ của nó. Bây giờ, hãy chọn một hộp khác để chứa int *b = &a
. int *b
cũng là một biến được lưu trữ ở đâu đó trong bộ nhớ, và nó là một con trỏ có chứa &a
, được phát âm là "địa chỉ của một".
int a = 5;
int *b = &a;
a b
+---+---+---+---+---+--
| 5 | |100| | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Bây giờ bạn có thể sử dụng mô hình này để làm việc trực quan thông qua bất kỳ kết hợp khác của các giá trị và gợi ý mà bạn thấy. Đó là một sự đơn giản hóa (vì như người đọc ngôn ngữ sẽ nói, con trỏ không phải là nhất thiết phải là một địa chỉ và bộ nhớ không phải là nhất thiết phải là tuần tự, và ngăn xếp và đống và đăng ký, v.v.) tương tự cho 99% máy tính và vi điều khiển.
Vì vậy, trong trường hợp của bạn,
int x = 35;
int y = 46;
x y
+---+---+---+---+---+--
| 35| 46| | | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
int *p = &x;
int *q = &y;
x y p q
+---+---+---+---+---+--
| 35| 46|100|101| | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
p = q;
x y p q
+---+---+---+---+---+--
| 35| 46|101|101| | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
*p = 90;
x y p q
+---+---+---+---+---+--
| 35| 90|101|101| | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Bây giờ là những gì *p
? *q
là gì?
Một câu trả lời rất thanh lịch. Khi tôi đã học C/C++, bạn tôi đã cho tôi một gợi ý để gọi * p là "nội dung của p" và nó trở nên rất rõ ràng sau đó. – lud0h