Hãy thay thế từ "con trỏ" với một kiểu dữ liệu đó là hy vọng quen thuộc hơn, giống như một int
:
int n = 42;
đây 42 là một giá trị int
, và n
là một biến chứa một int
. Bạn có thể gọi n
biến "int
". Một int là một số như 42 hoặc -25315685 và biến số int
giữ các số này. Một khi bạn có một biến, bạn có thể gán các số khác nhau cho nó. Không có gì khó hiểu cho đến nay?
A con trỏ giống như số int: một số. Nó sẽ xảy ra là một số xác định một vị trí bộ nhớ, và nếu một cái gì đó được lưu trữ trong vị trí bộ nhớ đó bạn có thể gọi nó là một địa chỉ . Giống như một int, một con trỏ có thể được lưu trữ trong một biến. Một biến lưu trữ một con trỏ có thể được gọi là một biến con trỏ.
Vì vậy, sự khác nhau giữa con trỏ và biến con trỏ là gì? Giá trị đầu tiên là một giá trị, giống như một số, cửa hàng thứ hai lưu các giá trị này. Nhưng mọi người thường đề cập đến các biến theo giá trị của chúng mà chúng lưu trữ; mọi người không gọi số n
biến "int
" nhưng chỉ int
, mặc dù nó có thể vào các thời điểm khác nhau lưu trữ khác nhau int
s.Trong văn bản này tôi sẽ làm như vậy và đôi khi viết con trỏ khi tôi có nghĩa là một biến con trỏ; hy vọng sự khác biệt sẽ rõ ràng.
Con trỏ có luôn là địa chỉ không? Đây là câu hỏi về ý nghĩa của từ "địa chỉ" hơn bất cứ thứ gì khác. Một con trỏ luôn luôn là một địa chỉ theo nghĩa nó tương ứng với một vị trí bộ nhớ theo cách này hay cách khác, đó là một "địa chỉ" cho vị trí bộ nhớ đó. Nhưng mặt khác, nếu vị trí bộ nhớ không thể truy cập được vào chương trình hoặc không có bất kỳ thứ gì được lưu trữ hữu ích trong đó, thì đó có phải là "địa chỉ" cho bất kỳ thứ gì không?
Bây giờ hãy điều tra đoạn mã sau:
int *p;
p = &n;
Dòng đầu tiên khai báo một biến con trỏ được gọi là p
. Các con trỏ có thể được lưu trữ vào p
là các vị trí bộ nhớ cho dữ liệu int
; điều này là quan trọng vì những lý do mà chúng ta sẽ thấy sau này. Chúng tôi vẫn không cung cấp cho bất kỳ giá trị nào, vì vậy con trỏ nó lưu trữ là tùy ý. Nó chắc chắn không lưu trữ địa chỉ của bất cứ điều gì hữu ích; nó thậm chí có thể trỏ đến một khu vực bộ nhớ không thể truy cập vào chương trình.
Trong dòng thứ hai, chúng tôi lấy địa chỉ của biến số n
với máy bay &
và gán cho p
. Hiện tại, p
lưu trữ địa chỉ của n
, vị trí bộ nhớ có giá trị là n
được lưu trữ.
Chúng ta có thể làm gì với con trỏ? Chúng ta có thể đọc và ghi vào vị trí bộ nhớ mà con trỏ xác định. Để thực hiện điều này, chúng tôi "dereference" con trỏ với *
-operator, và sau đó (*p)
có thể được sử dụng giống như bạn có thể sử dụng n
. Ví dụ, bạn có thể viết một giá trị mới vào n
với điều này:
*p = 123;
Đó là vào thời điểm này mà nó trở nên rõ ràng lý do tại sao chúng ta cần phải biết loại dữ liệu mà p
có thể trỏ đến: nếu không bạn không thể biết những gì bạn có thể gán cho (*p)
.
Lý do khác khiến việc biết loại dữ liệu p
có thể trỏ đến là số học con trỏ. Ví dụ: p+1
là con trỏ đến int
được lưu trữ trong bộ nhớ ngay sau n
; nếu p
là một con trỏ trỏ đến một cấu trúc dữ liệu lớn, p+1
sẽ là một con trỏ trỏ đến một cấu trúc dữ liệu cùng loại được lưu trữ ngay sau nó. Đối với điều này trình biên dịch phải biết kích thước của những gì con trỏ trỏ đến.
đọc ["Điều gì" dereferencing "có nghĩa là con trỏ?"] (Http://stackoverflow.com/questions/4955198/what-does-dereferencing-a-pointer-mean) có thể hữu ích và tất nhiên là từ wiki: ["Con trỏ (lập trình máy tính)"] (http://en.wikipedia.org/wiki/Pointer_ (computer_programming)) –
@GrijeshChauhan; Tôi đã đọc liên kết đầu tiên trước khi hỏi câu hỏi này :). Cảm ơn bạn đã liên kết thứ hai. – haccks
@GrijeshChauhan; Cảm ơn bạn đã liên kết wiki. Nó giải thích dereferencing một cách rất đẹp (thực sự nó đã được câu hỏi tiếp theo của tôi nếu bạn không cung cấp liên kết :)). – haccks