V. Kiểu dữ liệu có cấu trúc 5.1 Tệp định kiểu
Chương III Con trỏ và cấu trúc động
1. Khái niệm
2. Kiểu dữ liệu con trỏ - Biến con trỏ 2.1. Con trỏ định kiểu
Kiểu con trỏ là kiểu dữ liệu đặc biệt để biểu diễn các địa chỉ
Cú pháp
Type Tên_kiểu_ct = ^Tên_kiểu_dữ_liệu;
Tên kiểu con trỏ phải tuần theo quy tắc đặt tên chung của Pascal
Kiểu dữ liệu của con trỏ là kiểu dữ liệu đã được đ/n, phải tương thích
Chương III Con trỏ và cấu trúc động
2.1. Con trỏ định kiểu
Ví dụ
Type
Chu = string[20]; CT1 = ^Byte; CT2 = ^Chu; CT3 = ^Nguoi;
Nguoi = Record
Hoten: String[20];
Namsinh: 1900..2100; End;
Chương III Con trỏ và cấu trúc động
2.1. Con trỏ định kiểu
Chú ý:
Pascal chỉ cho 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 (nguyên, thực, kí tự)
Các kiểu có cấu trúc muốn đưa vào con trỏ phải thông qua 1 tên kiểu khai báo trong phần Type
Ví dụ khai báo sai: Type Hoten = ^String[20];
DS = ^Array[1..10] of Byte;
Khai báo đúng: Type S1 = String[20]; Hoten = ^S1;
Chương III Con trỏ và cấu trúc động
2.2. Biến con trỏ
Giống biến mảng, bản ghi, tập
Khai báo thông qua kiểu con trỏ hoặc trực tiếp
Không dùng để lưu giá trị mà lưu địa chỉ biến
Kích thước biến con trỏ là 4 byte
Các hàm và thủ tục xử lý biến con trỏ được Pascal lưu trong unit System
Quy ước: Các biến con trỏ là tương thích nếu chúng trỏ tới cùng 1 kiểu dữ liệu
Chương III Con trỏ và cấu trúc động
2.3. Con trỏ không định kiểu
Là con trỏ không quan tâm đến kiểu dữ liệu mà nó trỏ tới, sử dụng tên chuẩn Pointer
Var
Chương III Con trỏ và cấu trúc động
2.4. Địa chỉ của một đối tượng
Đối tượng gồm: biến, hàm, thủ tục
Địa chỉ của đố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 nó
Bộ nhớ PC được chia thành nhiều đoạn, mỗi đoạn có 65536 ô nhớ, ô đầu tiên có địa chỉ 0, ô cuối có địa chỉa 65535
Địa chỉ 1 ô nhớ, cần biết địa chỉ đoạn, địa chỉ ô
Địa chỉ đoạn là segment (2byte), địa chỉ tương đối của ô trong đoạn là offset (2byte)
Chương III Con trỏ và cấu trúc động
3. Các thủ tục và hàm tác động trên con trỏ 3.1. Gán giá trị ban đầu
Ct là biến con trỏ, để đảm bảo ct chưa trỏ tới bất kỳ đối tượng nào, ct = rỗng
Chương III Con trỏ và cấu trúc động
3.2. Gán địa chỉ của 1 đối tượng cho con trỏ a. ct:=@x;
Toán tử @ tác động trên đối tượng x, gán vào con trỏ ct địa chỉ kiểu pointer của đối tượng
b. ct:=Addr(x);
Hàm Addr() cho địa chỉ của đối tượng x, thuộc kiểu pointer
c. Ct:=Ptr(segment,offset);
Segment, offset là giá trị kiểu Word viết trong hệ 16
Chương III Con trỏ và cấu trúc động
3.3. Phép gán giữa 2 con trỏ
Hai con trỏ cùng tương thích có thể gán giá trị cho nhau, khi đó chúng cùng trỏ tới 1 địa chỉ
Ví dụ Var ct1:^Float; ct2:^byte; ct3:Pointer; x:String; Gán: ct3:=@x; ct2:=ct3; {Hợp lệ} ct1:=ct2; {Không hợp lệ}
Chương III Con trỏ và cấu trúc động
3.4. Phép so sánh giữa 2 con trỏ
Thực hiện phép so sánh bằng (=) và khác (<>) giữa 2 con trỏ nếu chúng tương thích, kết quả là True hoặc False
Hai con trỏ được gọi là bằng nhau nếu cùng trỏ tới 1 đối tượng, ngược lại là khác nhau
Chương III Con trỏ và cấu trúc động
4. Truy nhập dữ liệu
Khi con trỏ ct đang trỏ tới 1 vùng dữ liệu nào đó, Pascal cho phép dùng kí hiệu ct^ như 1 biến truy nhập vào vùng dữ liệu đó
Ct^ mang dữ liệu của vùng mà ct đang trỏ tới
Ví dụ
Ct Ct^
-Mang địa chỉ của đối
tượng được trỏ tới -Chứa đựng dữ liệu trong vùng nhớ mà ct đang trỏ tới
Chương III Con trỏ và cấu trúc động
4. Truy nhập dữ liệu
Kiểu dữ liệu của biến ct^ là kiểu đã khai báo cho ct mà không phải kiểu dữ liệu của đối tượng
Địa chỉ của 1 đối tượng có thể gán cho bất kỳ con trỏ nào
Muốn sử dụng ct^ như 1 biến thông thường thay thế đối tượng thì biến con trỏ và đối tượng phải tương thích về kiểu
Con trỏ không kiểu pointer không thể coi là tương đương với các biến kiểu thông thường, không dùng Read/Write với pointer
Chương III Con trỏ và cấu trúc động
5. Mảng con trỏ và con trỏ kiểu mảng 5.1. Con trỏ kiểu mảng
Khai báo
Type m = array[1..5] of byte;
Var
ct1:^m;
Ct1: Là biến con trỏ kiểu mảng, ct1^ gồm 5 phần tử, mỗi phần tử có kiểu byte
Chương III Con trỏ và cấu trúc động
5. Mảng con trỏ và con trỏ kiểu mảng 5.2. Mảng con trỏ
Mảng mà phần tử của nó là con trỏ
Khai báo
Var ct:Array[1..10] of ^String; s1, s2:String;
Chương III Con trỏ và cấu trúc động
6. Cấp phát động
6.1. Quản lý vùng nhớ Heap
Cấp phát động là cấp phát được thực hiện bởi câu lệnh trong thân CT chứ không phải bằng cách khai báo biến hoặc tham số
Một biến được cấp phát động là biến động (dynamic variable), vùng nhớ dành cho cấp phát động là vùng Heap