Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 12 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
12
Dung lượng
75,56 KB
Nội dung
Con trỏ cấu trúc động Con trỏ cấu trúc động Bởi: Thu Nguyen CON TRỎ VÀ CẤU TRÚC ĐỘNG Khái niệm: Khi khai báo biến, dù biến đơn hay biến thuộc kiểu 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 byte B: array[1 100] of integer; biến mảng b cần 200 byte Việc khai báo thường đoán dung lượng cần thiết không thật xác, gây nên lãng phí nhớ Để tiết kiệm nhớ, chương trình làm việc, người lập trình yêu cầu cấp phát nhớ cho biến, điều gọi cấp phát nhớ động Cấp phát nhớ động thực thông qua biến trỏ Muốn có biến trỏ ta phải định nghĩa kiểu trỏ Kiểu liệu trỏ-biến trỏ: • Con trỏ có định kiểu: Kiểu trỏ kiểu liệu đặc biệt dùng để biểu diễn địa Kiểu trỏ định nghĩa theo cú pháp: Tên kiểu trỏ=^Kiểu liệu; Ví dụ 4.1: Chu=String[20]; CT1=^Byte; CT2=^Chu; 1/12 Con trỏ cấu trúc động CT3=^Nguoi; Nguoi=record Hoten:String[20]; Namsinh:1900 2100; End; Chú ý: ta phép đưa trực tiếp vào định nghĩa kiểu trỏ kiểu liệu đơn giản sau: số nguyên, số thực, ký tự Các kiểu liệu có cấu trúc muốn đưa vào trỏ phải thông qua tên kiểu khai báo phần Type Cách định nghĩa kiểu trỏ Hoten Ds sau sai: Type Hoten=^String[20]; Ds=Array[1 10] of Byte; Muốn sử dụng kiểu chuỗi mảng cho kiểu trỏ phải định nghĩa sau: Type S1=String[20]; Hoten=^S1; a=array[1 10] of Byte; Ds=^a; • Biến trỏ: Biến trỏ khai báo thông qua kiểu trỏ khai báo trực tiếp Ví dụ 4.2: Var So:^integer; 2/12 Con trỏ cấu trúc động Sinhvien:CT3; Hoten:CT2; Thutu, Mahoso:^Word; Biến trỏ không dùng để lưu trữ giá trị biến mà lưu trữ địa biến Dù kích thước vùng liệu mà biến trỏ trỏ tới khác kích thước biến trỏ byte • Con trỏ không định kiểu: Là kiểu trỏ không quan tâm đến kiểu liệu mà trỏ tới Cách khai báo: Var tên biến: Pointer; • Địa đối tượng: Địa đối tượng nhớ xác định địa ô nhớ mà hệ thống dành cho đối tượng $0101 $FFFF Segment (địa đoạn) Offset(địa tương đối đọan) Địa ô thứ 65535, thuộc đoạn 257 Các thủ tục hàm tác động lên trỏ: • Gán giá trị ban đầu: Ct:=nil; • Gán địa đối tượng cho trỏ: ct:=@x; b ct:=Addr(x) Hàm Addr()cho địa đối tượng x, địa thuộc kiểu Pointer c ct:=Ptr(segment): 3/12 Con trỏ cấu trúc động Hàm Ptr phép gán đòi hỏi tham số segment offset phải giá trị kiểu Word viết hệ 16, ví dụ : ct:= Ptr($B800,$0000);đưa trỏ trỏ tới ô nhớ vùng Video Ram Nhận xét: Hai phép gán @ Addr() trả địa kiểu pointer nên chúng tương đương 3 phép gán hai trỏ Hai trỏ tương thích (cùng kiểu) gán giá trị cho nhau, chúng trỏ tới địa Ví dụ 4.3 Var ct1:^Float; ct2:^Byte; ct3:^Pointer; x:string; Ví dụ khai báo ba trỏ thuộc ba kiểu khác nhau, ct1 trỏ thực,ct2 trỏ nguyên ct3là trỏ không định kiểu, x biến chuỗi Khi phép gán : ct3:@x; ct2=ct3; hợp lệ ct2 ct3 tương thích, chúng trỏ đến địa biến x ct1:=ct2; không hợp lệ hai trỏ không tương thích Phép so sánh hai trỏ Chỉ tồn phép so sánh =(bằng nhau)và(khác nhau)giữa hai trỏ chúng tương thích Kết so sánh giá trị Boolean nghĩa True False 4/12 Con trỏ cấu trúc động Hai trỏ tương thíchgọi chúng trỏ tới đối tượng , ngược lại gọi khác 4.Truy nhập liệu Khi trỏ ct trỏ tới vùng liệu Pascal cho phép dùng ký hiệu ct^ biến để truy nhập vào vùng liệu Biến ct^ mang liệu vùng mà trỏ ct trỏ tới Như truy nhập tới biến, hàm hai thủ tục mà không cần biết tên đối tượng miễn biết trỏ trỏ vào chúng Ví dụ 4.5 Program contro; Uses crt; Type zl= string[3]; Var z:string;ct:^zl;i:byte; Begin clrscr; z:=’Ha noi’;ct:=@z; writeln(ct^); For i:=1 to length(z) write(upcase(ct^[i]); Readln; End Chạy chương trình ta nhận kết quả: Ha noi HA NOI 5/12 Con trỏ cấu trúc động Mọi xử lý biến z xử lý biến ct^ biến trỏ ct trỏ vào z Mảng trỏ trỏ kiểu mảng: Con trỏ kiểu liệu nên biến trỏ thành phần mảng, ngược lại mảng kiểu liệu có cấu trúc nên trỏ trỏ tới biến mảng 5.1 Con trỏ kiểu mảng: Khai báo: Type m= array[1 5] of Byte; Var Ct1:^m; Ct1 biến trỏ kiểu mảng, biến ct1^ gồm phần tử, phần tử số kiểu Byte Truy cập vào biến ct1^: Read(ct1^[i]); Write(ct1^[i]); 5.2 Mảng trỏ: Khai báo: Var: Ct:array[1 10] of ^string; s1,s2:String; Begin s1,s2:String; Begin S1:=’Ha noi Viet nam’; S2:=’Happy new Year’; 6/12 Con trỏ cấu trúc động … Ct mảng 10 trỏ, tất 10 trỏ trỏ tới đến kiểu liệu String Mỗi trỏ trỏ đến đối tương khác • Nếu ta chưa gán địa đối tượng cho biến trỏ mà thực phép gán: Ct[i]:^=s1; với 1[...]... Ctcuoi:=dslop; Ctcuoi^.Tiep:=nil; Ctcuoi:=dslop; {hướng ctcuoi vào bản ghi hiện thời} Kết thúc lặp • Chèn thêm phần tử vào danh sách: Quá trình chèn một phần tử vào danh sách qua các bước sau: - Xác định vị trí chèn - Tạo một biến động và xin cấp phát vùng nhớ cho biến động để lưu dữ liệu sẽ chèn vào danh sách 11/12 Con trỏ và cấu trúc động - Chuyển trường Tiep của phần tử hiện thời đến phần tử bổ.. .Con trỏ và cấu trúc động writeln('nhap tiep khong?C/K'); tt:=readkey; writeln; end; Until tt in ['k','K']; Hien_lifo; Readln; END • Hàng đợi Queue-Danh sách liên kết thuận: Là loại danh sách mà phần tử nào nhập trước thì được lấy ra trước Ctdau:=nil; {khởi tạo danh sách}; Bắt đầu lặp: New (dslop); {tạo biến động lưu trữ dữ liệu nhập vào} Nhập dữ liệu; {nhập dữ liệu... trường Tiep của phần tử bổ sung đến phần tử trước phần tử hiện thời New(ct1); With ct1^ do Nhập dữ liệu cho phần tử bổ sung Dslop:=ctcuoi; {hướng con trỏ đến phần tử cuối cùng trong danh sách} While (dslopnil) and (dslop^.mhsn) do Dslop:=dslop^.tiep; {hướng con trỏ đến vị trí cần chèn} Ct1^.tiep:=dslop^.tiep; Dslop^.tiep:=ct1; 12/12