- Biến tĩnh: Là những biến khi khai báo, một lượng ô nhớ cho các biến
này sẽ được cấp phát mà không cần biết trong quá trình thực thi chương trình có sử dụng hết lượng ô nhớ này hay không. Mặt khác, các biến tĩnh (nhất là các biến toàn cục) sẽ tồn tại trong suốt thời gian thực thi chương trình, gồm cả những biến mà chương trình chỉ sử dụng 1 lần rồi bỏ.
Một số hạn chế có thể gặp phải khi sử dụng các biến tĩnh: • Cấp phát ô nhớ dư, gây ra lãng phí ô nhớ.
• Cấp phát ô nhớ thiếu, chương trình thực thi bị lỗi.
- Biến động: Biến động được tạo ra và khởi tạo giá trị khi chương trình
hoạt động. Đặc biệt là biến động được thu hồi bộ nhớ ngay khi có lệnh yêu cầu giải phóng vùng nhớ nó đang chiếm giữ để có thể sử dụng vào việc khác.
Đặc điểm của biến động:
• Chỉ phát sinh trong quá trình thực hiện chương trình chứ không phát sinh lúc bắt đầu chương trình.
• Khi chạy chương trình, kích thước của biến, vùng nhớ và địa chỉ vùng nhớ được cấp phát cho biến có thể thay đổi.
• Sau khi sử dụng xong có thể giải phóng để tiết kiệm chỗ trong bộ nhớ.
- Biến con trỏ: Biến động không có địa chỉ nhất định nên ta không thể
truy cập đến chúng được. Vì thế, ở các ngôn ngữ lập trình như ngôn ngữ C đã cung cấp cho ta một loại biến đặc biệt để khắc phục tình trạng này, đó là biến con trỏ (pointer) với các đặc điểm:
• Biến con trỏ không chứa dữ liệu mà chỉ chứa địa chỉ của dữ liệu ( hay chứa địa chỉ của ô nhớ chứa dữ liệu), nó dùng để truy cập biến thông qua địa chỉ biến và chương trình tham chiếu biến gián tiếp qua địa chỉ này.
• Kích thước của biến con trỏ không phụ thuộc vào kiểu dữ liệu, luôn có kích thước cố định ( 2 bytes hoặc 4 bytes,…).
135 2. Khai báo biến con trỏ :
2.1. Khai báo biến con trỏ có kiểu:
- Cú pháp: <Kiểu dữ liệu> * <Tên biến >; Hoặc <Kiểu dữ liệu>* <Tên biến >; - Giải thích :
<Kiểu dữ liệu>: Là tên một kiểu dữ liệu trong ngôn ngữ C, <kiểu dữ liệu> ở đây là kiểu dữ liệu được trỏ tới, không phải là kiểu của bản thân con trỏ.
* <Tên biến >: Dấu * trước tên biến thể hiện biến này là biến con trỏ. Nó chứa địa chỉ của các biến có cùng <Kiểu dữ liệu> mà nó sẽ trỏ đến.
Ví dụ 1:
int *pa, *pb;
Khai báo 2 biến pa, pb là 2 biến con trỏ, sẽ chứa địa chỉ các biến có kiểu int mà nó trỏ đến.
Ví dụ 2:
float *px, *py;
Khai báo 2 biến px, py là 2 biến con trỏ, sẽ chứa địa chỉ các biến có kiểu float mà nó trỏ đến.