3.1.3 Gán giá trị cho con trỏ

Làm thế nào để chúng ta gán một giá trị cho biến con trỏ?

Chúng ta có thể gán một giá trị cho con trỏ ? Tất nhiên, cũng giống như cách mà chúng ta vẫn dùng để gán giá trị cho các biến bình thường: sử dụng toán tử =.

Một câu hỏi quan trọng hơn là những giá trị nào chúng ta được phép gán cho các con trỏ ?

* Sử dụng số một cách trực tiếp không phải là một lựa chọn đúng đắn. Trình biên dịch sẽ không cho phép bạn viết một cái gì đó như thế này →

vì, trước tiên, cú pháp ngôn ngữ C++ không cho phép điều đó và thứ hai, nếu bạn biết những gì được lưu trữ trong bộ nhớ của máy tính tại địa chỉ 148324, thì bạn là một người thiên tài vcđ và lập trình máy tính chỉ là một sự lãng phí thời gian của bạn.

* Tuy nhiên, có một ngoại lệ đặc biệt. Bạn có thể gán zero cho biến con trỏ. Trình biên dịch sẽ không chửi bạn vì điều này đâu

Một con trỏ được gán một giá trị bằng 0 được gọi là một con trỏ null. Con trỏ như vậy không trỏ đến bất cứ đâu nhưng con trỏ này có thể rất hữu ích và thậm chí đôi khi rất cần thiết.

Do thực tế là việc gán giá trị cho một con trỏ đôi khi gây hiểu nhầm hoặc thậm chí gây lỗi (có thể gây nhầm lẫn giữa con trỏ với một biến kiểu int), có một luật bất thành văn rằng các lập trình viên không nên gán các con trỏ bằng 0. Thay vào đó, họ sẽ gán nó bằng NULL tuân theo quy ước (hay còn gọi là convention) →

Ký hiệu NULL thực ra cũng bằng 0. Nó trông giống như một biến nhưng bạn không thể sửa đổi giá trị của nó. Đó là cái gọi là macro. Chúng ta sẽ nói về nó trong các bài sau. Quy ước cũng nói rằng NULL chỉ nên được dùng để gán giá trị cho con trỏ. Chú ý rằng: Vì ký hiệu NULL được định nghĩa trong “cstring” nên nếu bạn muốn sử dụng NULL, bạn phải include file header có tên là “cstring” hoặc bất kỳ file header nào khác có include “cstring” (một trong số chúng là “iostream”).

* Làm thế nào để chúng ta gán bất kỳ giá trị có ý nghĩa khác với NULL cho con trỏ ? Chúng ta có thể chỉ định con trỏ với giá trị trỏ tới bất kỳ biến nào đã tồn tại. Để làm điều đó, chúng ta cần một toán tử & được gọi là toán tử tham chiếu. Đây là một toán tử tiền tố đơn phân (còn gọi là toán tử một ngôi – unary) và nó khác với toán tử nhị phân & bitwise. Toán tử chỉ đơn giản tìm ra địa chỉ của đối số của nó. Xem câu lệnh →

Sau phép gán này thì biến p sẽ trỏ tới vị trí mà biến i được lưu trữ trong bộ nhớ. Chúng ta có hiểu như thế này →

Nếu bạn gán NULL cho con trỏ, nó sẽ trông như thế này.

Kể từ lúc này, con trỏ p không trỏ vào biến hay bất kỳ biến nào khác. Như bạn nhìn thấy trong hình thì chúng ta có thể coi như con trỏ được nối với đất.