<< Chapter < Page | Chapter >> Page > |
CON TRỎ VÀ CẤU TRÚC ĐỘNG
Khi khai báo một biến, dù là biến đơn hay biến thuộc kiểu dữ liệu có cấu trúc, ta đã quy định độ lớn vùng nhớ dành cho biến:
VD: a: real; biến a cần 6 byte
B: array[1..100] of integer; biến mảng b cần 200 byte
Việc khai báo như trên thường là phỏng đoán dung lượng cần thiết chứ không thật chính xác, gây nên lãng phí bộ nhớ.
Để tiết kiệm bộ nhớ, ngay khi chương trình đang làm việc, người lập trình có thể yêu cầu cấp phát bộ nhớ cho các biến, điều này gọi là cấp phát bộ nhớ động. Cấp phát bộ nhớ động được thực hiện thông qua biến con trỏ. Muốn có biến con trỏ ta phải định nghĩa kiểu con trỏ.
Kiểu dữ liệu con trỏ-biến con trỏ:
Kiểu con trỏ là một kiểu dữ liệu đặc biệt dùng để biểu diễn các địa chỉ. Kiểu con trỏ được định nghĩa theo cú pháp:
Tên kiểu con trỏ=^Kiểu dữ liệu;
Ví dụ 4.1:
Chu=String[20];
CT1=^Byte;
CT2=^Chu;
CT3=^Nguoi;
Nguoi=record
Hoten:String[20];
Namsinh:1900..2100;
End;
Chú ý: ta chỉ được phép đưa trực tiếp vào định nghĩa kiểu con trỏ các kiểu dữ liệu đơn giản sau: số nguyên, số thực, ký tự. Các kiểu dữ liệu có cấu trúc muốn đưa vào con trỏ thì phải thông qua một tên kiểu khai báo trong phần Type.
Cách định nghĩa 2 kiểu con trỏ Hoten và Ds sau là sai:
Type
Hoten=^String[20];
Ds=Array[1..10] of Byte;
Muốn sử dụng kiểu chuỗi và mảng cho kiểu con trỏ chúng ta phải định nghĩa như sau:
Type
S1=String[20];
Hoten=^S1;
a=array[1..10] of Byte;
Ds=^a;
Biến con trỏ có thể khai báo thông qua kiểu con trỏ hoặc khai báo trực tiếp.
Ví dụ 4.2:
Var
So:^integer;
Sinhvien:CT3;
Hoten:CT2;
Thutu, Mahoso:^Word;
Biến con trỏ không dùng để lưu trữ các giá trị của biến mà lưu trữ địa chỉ của biến. Dù kích thước vùng dữ liệu mà các biến con trỏ trỏ tới khác nhau nhưng kích thước của biến con trỏ vẫn là 4 byte.
Là kiểu con trỏ không quan tâm đến kiểu dữ liệu mà nó trỏ tới.
Cách khai báo:
Var tên biến: Pointer;
Địa chỉ một đối tượng trong bộ nhớ được xác định bởi địa chỉ của ô nhớ đầu tiên mà hệ thống dành cho đối tượng đó.
$0101 | $FFFF |
Segment (địa chỉ đoạn) | Offset(địa chỉ tương đối trong đọan) |
Địa chỉ ô thứ 65535, thuộc đoạn 257.
Các thủ tục và hàm tác động lên con trỏ:
Ct:=nil;
b. ct:=Addr(x)
Hàm Addr()cho địa chỉ của đối tượng x, địa chỉ này thuộc kiểu Pointer
c. ct:=Ptr(segment):
Hàm Ptr trong phép gán trên đòi hỏi các tham số segment và offset phải là giá trị kiểu Word viết trong hệ 16, ví dụ :
ct:= Ptr($B800,$0000);đưa con trỏ trỏ tới ô nhớ của vùng Video Ram
Nhận xét:
Hai phép gán @ và Addr() cùng trả về địa chỉ kiểu pointer nên chúng là tương đương.
3. 3 phép gán giữa hai con trỏ
Hai con trỏ tương thích (cùng kiểu) có thể gán giá trị cho nhau, khi đó chúng cùng trỏ tới một địa chỉ .
Ví dụ 4.3
Var
ct1:^Float;
ct2:^Byte;
ct3:^Pointer;
x:string;
Ví dụ trên khai báo ba con trỏ thuộc ba kiểu khác nhau, ct1 là con trỏ thực,ct2 là con trỏ nguyên và ct3là con trỏ không định kiểu, x là biến chuỗi. Khi đó các phép gán :
Notification Switch
Would you like to follow the 'Lập trình nâng cao' conversation and receive update notifications?