Tùy theo mô hình bộ nhớ và đoạn, con trỏ được phân thành ba loại:
- Con trỏ Near (gần)
- Con trỏ Far (xa)
- Con trỏ Huge (lớn)
Con trỏ Near
Là con trỏ hoạt động trong phạm vi 64KB đoạn dữ liệu của bộ nhớ.
Không thể truy cập địa chỉ vượt quá đoạn dữ liệu đó.
Con trỏ near có thể tăng/giảm địa chỉ bằng toán tử số học.
Với từ khóa near, ta có thể làm cho bất kỳ con trỏ nào thành near pointer.
Cú pháp
Cú pháp như sau:
<kiểu dữ liệu> near <định nghĩa con trỏ> <kiểu dữ liệu> near <định nghĩa hàm>
Câu lệnh sau khai báo con trỏ near cho biến s:
char near *string;
Chương trình
Chương trình sau minh họa dùng con trỏ near:
#include <stdio.h>
int main() {
int number = 50;
int near *p;
p = &number;
printf("%d", sizeof(p));
return 0;
}
Kết quả
Kết quả như sau:
2
Con trỏ Far
Là con trỏ lưu cả offset và địa chỉ đoạn mà con trỏ tham chiếu.
Có thể truy cập tất cả 16 đoạn.
Địa chỉ far pointer từ 0 đến 1MB.
Khi con trỏ tăng/giảm, chỉ phần offset thay đổi.
Cú pháp
Cú pháp như sau:
<kiểu dữ liệu> far <định nghĩa con trỏ> <kiểu dữ liệu> far <định nghĩa hàm>
Câu lệnh sau khai báo con trỏ far cho biến s:
char far *s;
Chương trình
Chương trình sau minh họa dùng con trỏ far:
#include <stdio.h>
int main() {
int number = 50;
int far *p;
p = &number;
printf("%d", sizeof number);
return 0;
}
Kết quả
Kết quả như sau:
4
Con trỏ Huge
Là con trỏ tương tự far pointer về kích thước vì cả hai đều là địa chỉ 32-bit.
Con trỏ huge có thể tăng mà không gặp vấn đề vòng đoạn (segment wrap-around).
Chương trình
Chương trình sau minh họa dùng con trỏ huge:
#include <stdio.h>
int main() {
char huge *far *ptr;
printf("%d %d %d", sizeof(ptr), sizeof(*ptr), sizeof(**ptr));
return 0;
}
Kết quả
Kết quả như sau:
4 4 1