Chương III Con trỏ và cấu trúc động

Một phần của tài liệu KTLT (Trang 68 - 83)

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu KTLT (Trang 68 - 83)