<< Chapter < Page Chapter >> Page >
Con trỏ và cấu trúc động

CON TRỎ VÀ CẤU TRÚC ĐỘNG

  • Khái niệm:

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ỏ:

  • Con trỏ có định kiểu:

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ỏ:

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.

  • Con trỏ không định kiểu:

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ỉ của một đối tượng:

Đị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ỏ:

  • Gán giá trị ban đầu:

Ct:=nil;

  • Gán địa chỉ của một đối tượng cho con trỏ:
  • ct:=@x;

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 :

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Lập trình nâng cao. OpenStax CNX. Sep 19, 2008 Download for free at http://cnx.org/content/col10576/1.2
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Lập trình nâng cao' conversation and receive update notifications?

Ask