7.1.1 Định nghĩa biến con trỏ (gọi tắt là con trỏ):
Con trỏ là biến chứa địa chỉ của biến khác.
Vậy là con trỏ không chứa dữ liệu, chỉ chứa địa chỉ của dữ liệu.
Kích thước của biến con trỏ không phụ thuộc vào đối tượng mà nó trỏ tới là kiểu gì. Kích thước cố định của biến con trỏ là 2 byte dùng để lưu địa chỉ của biến. Khi nó đang lưu địa chỉ của biến nào, ta nói nó đang trỏ tới biến ấy.
Ta cần nhớ điểm cơ bản là: Con trỏ là biến, nên có thể nói đến giá trị của nó. Giá trị của con trỏ là địa chỉ của biến mà nó trỏ tới.
Vì có nhiều loại địa chỉ nên cũng có bấy nhiêu kiểu con trỏ tương ứng.
Nhắc lại rằng địa chỉ của biến là số thứ tự của byte đầu tiên trong một dãy các byte liên tiếp mà máy dành cho biến.
Để lấy địa chỉ của biến, ta dùng phép toán &.
& là phép toán 1 ngôi trả về địa chỉ toán hạng của nó. &x trả về địa chỉ của biến x.
7.1.2. Khai báo:
Cú pháp:
KDL *Ten_Con_Tro; Trong đó:
KDL là Kiểu dữ liệu của con trỏ, có thể là char, int, double, cấu trúc ... Ten_Con_Tro: là tên, chỉ tên của con trỏ.
*: là phép toán con trỏ.
7.1.3 Các phép toán trên con trỏ và biểu thức:
1) Phép toán 1 ngôi: Đó là phép toán “ * “ tác dụng lên con trỏ.
Phép toán một ngôi * coi toán hạng của nó là địa chỉ cần xét và thâm nhập tới địa chỉ đó để lấy ra nội dung.
Tức là: *px là nội dung cuả địa chỉ do px trỏ tới ( nếu px trỏ tới x thì: *px == x). 2) Phép gán:
Có thể thực hiện phép gán: Các con trỏ cùng kiểu.
Gán địa chỉ của biến cho tên con trỏ. Biến và con trỏ phải cùng kiểu. Cú pháp: Ten_Con_Tro = &bien;
3) Phép tăng, giảm địa chỉ ( Số học địa chỉ ): Các phép toán tự tăng ( ++ ), tự giảm ( -- ).
Phép cộng ( + ) hay trừ ( - ) con trỏ với số nguyên dùng cho kiểu mảng. 4) Nguyên tắc truy nhập bộ nhớ:
Con trỏ kiểu Type truy cập tới sizeof(Type) bytes. 5) Phép so sánh:
So sánh các con trỏ cùng kiểu. 6) Con trỏ trong biểu thức:
Trong biểu thức:
Ta có thể sử dụng tên con trỏ, chẳng hạn gán địa chỉ của biến cho tên con trỏ Hoặc là dạng khai báo con trỏ.
7.1.4 Con trỏ kiểu void:
Khai báo:
void *Ten_Con_Tro;
Đây là con trỏ đặc biệt không định kiểu trước, nó có thể nhận bất kỳ địa chỉ của kiểu nào.
7.1.5 Con trỏ NULL:
Một con trỏ có thể nhận giá trị hằng đặc biệt: NULL
7.1.6 Cấp phát vùng nhớ, giải phóng vùng nhớ:
1) Cấp phát vùng nhớ để lưu dữ liệu:
Để cấp phát vùng nhớ cho biến con trỏ trước khi sử dụng, trong C++ dùng hàm new. Cách viết như sau:
Ten_Con_Tro = new KDL;
Khi đó con trỏ sẽ trỏ tới địa chỉ đầu của vùng nhớ đã cấp phát cho nó. b) Giải phóng vùng nhớ:
Vùng nhớ sau khi sử dụng xong có thể xóa bỏ bằng hàm delete để tiết kiệm bộ nhớ, và tăng tốc độ thực hiện của chương trình. Cú pháp như sau:
delete Ten_Con_Tro ;
Trong đó, vùng nhớ cần giải phóng tức là tên của biến con trỏ đang chiếm giữ vùng nhớ.
7.1.7 Kiểu con trỏ
Dùng từ khóa typedef:
Typedef KDL *Ten_Kieu; Tên_Kieu a,b,c;