Home / Lập trình / Pascal / Bài 11 – Con trỏ trong Pascal

Bài 11 – Con trỏ trong Pascal

Bài 11 - Con trỏ trong Pascal

Biến tĩnh là biến có kích thước, kiểu dữ liệu và địa chỉ của biến là không đổi, các biến này tồn tại trong suốt quá trình chạy chương trình. Và từ trước đến này chúng ta vẫn dùng biến tĩnh, đó là lý do gây lãng phí bộ nhớ.Biến động là biến có thể thay đổi được kích thước và địa chỉ vùng nhớ được cấp phát trong quá trình chạy chương trình. Đây chính là giải pháp của chúng ta. hehe. Tuy nhiên vấn đề là biến động không có địa chỉ cố định nên không thể truy xuất đến chúng được.
Biến con trỏ là bién chuyên dùng để chứa địa chỉ của biến động giúp ta truy cập đến biến động. Woa, giải pháp là đây =)). Dữ liệu của kiểu biến con trỏ gọi là kiểu con trỏ.

Bây giờ ta sẽ đi vào một vài phần của biến con trỏ.

1. Định nghĩa kiểu con trỏ
Cú pháp:

1
2
Type
    <Kieu con tro> = <^Kieu du lieu>

Ví dụ:

1
2
Type
    int = ^integer;

Lưu ý: Khi định nghĩa kiểu con trỏ kiểu cấu trúc tự trỏ (kiểu bản ghi tự trỏ) ta phải định nghĩa kiểu con trỏ trước rồi mới định nghĩa kiểu bản ghi.
Ví dụ:

1
2
3
4
5
6
7
8
Type
        ControSV = ^sinhvien;
        sinhvien = record
                MSV : string;
                Hoten : string;
                Diem : real;
                next : ControSV;
        end;

2. Khai báo biến con trỏ
Chúng ta có thể khai báo trực tiếp hoặc giản tiếp. Ví dụ với kiểu sinhvien và ControSV ta có thể khai báo

1
2
3
var
        sv1 : ControSV;         {khai bao gian tiep}
        sv2 : ^sinhvien;        {khai bao truc tiep}

Ngoài ra chúng ta có thể khai báo như sau khi không quan tâm tới một kiểu dữ liệu nào.

1
2
var
        p : pointer;

Sau khi khai báo biến con trỏ p là một con trỏ tổng quá không thuộc một kiểu dữ liệu cụ thể nào.

3. Cấp phát vùng nhớ cho các biến.
Chúng ta chú ý rằng biến con trỏ cũng là biến tĩnh nên nó được máy cấp phát vùng nhớ 4 byte. Ví dụ với biến sv1 như trên thì sv1 là 1 biến con trỏ, nó được cấp phát vùng nhớ 4 byte còn biến sv1^ mới là biến động và chưa được cấp phát. Tức ta có thể hiểu sv1 là biến con trỏ chứa địa chỉ của biến động sv1^.
Để cấp phát vùng nhớ cho biến động sv1 ta dùng toán tử New(sv1);
Bài 11 - Con trỏ trong Pascal
Con trỏ NIL là con trỏ đặc biệt, không trỏ tới đâu cả. Giá trị của con trỏ NILL bằng 0 hay là rỗng tương ứng với mọi kiểu con trỏ.

4. Các phép toán.
a. Phép gán
Hai con trỏ có thể gán cho nhau bằng phép gán ( := ) nếu như chúng cùng kiểu. Trong ví dụ trên chúng ta có thể gán:

1
sv1 := sv2;

Ngoài ra chúng ta cũng có thể gán

1
p := sv1;

nhưng không thể gán ngược lại vì p là con trỏ pointer có kiểu tổng quát.
Chúng ta có thể gán giá trị NIL cho bất kỳ con trỏ nào.

b. Phép so sánh
Chúng ta chỉ sử dụng được phép so sánh bằng ( = ) và phép so sánh khác ( <> ) cho kiểu con trỏ. Nếu con trỏ p và q cũng trỏ tới một địa chỉ của một biến động (cùng trỏ tới một biến động) thì chúng được coi là bằng nhau, ngược lại sẽ khác nhau.

5. Trỏ con trỏ tới 1 biến
Khi ta có 1 biến a thuộc kiểu integer, ta sẽ dùng toán tử @ để trỏ con trỏ p tới vùng nhớ của biến a.

1
p := @a;

6. Truy xuất dữ liệu
Biến con trỏ chỉ chứa địa chỉ của biến động nên chúng ta không thể nhập xuất trực tiếp cho biến con trỏ mà phải nhập xuất cho biến động mà nó trỏ tới.
Ví dụ sau thực hiện truy xuất, tính toán trên con trỏ.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
uses crt;
var
        p : ^integer;
        a, s : integer;
BEGIN
        clrscr;
        write('Nhap vao mot so (kieu con tro) p^ = ');
        new(p);
        readln(p^);
        write('Nhap vao mot so (kieu so nguyen) a =  ');
        readln(a);
        s := 100*p^ + a;
        writeln('100p^ + a = : ', s);
        readln;
END.

Check Also

Bài 9 - Kiểu bản ghi – Record

Bài 9 – Kiểu bản ghi – Record

Số người xem bài viết 5