Відповідно до механізму адресації, існують покажчики (і модифікатори) трьох типів:
a near
a far
a huge
Покажчики типу near застосовуютьсялише в стандартних сегментах (моделі пам'яті small і tiny). Їх специфіка полягає в тому, що в усіх операціях використовується лише зміщення всередині сегмента, а не його адреса. Тому всі операції виконуються значно швидше.
Покажчики типу far використовують як адресу сегмента, так і зміщення, але адреса сегмента використовується лише для його знаходження. Усі операції над покажчиками виконуються лише із врахуванням зміщення. Значення покажчика far циклічно змінюється в межах одного сегмента.
Для покажчиків типу huge в усіх операціях використовується адреса як сегмента, так і зміщення. Тому для покажчиків типу huge завжди коректними будуть операції порівняння, додавання.
Модифікатори можуть стояти як перед знаком *, так і безпосередньо перед ідентифікатором. Якщо модифікатор стоїть перед ідентифікатором, то він модифікує тип адреси, за якою даний об'єкт записується в пам'яті. Якщо модифікатор стоїть перед знаком *, то це означає, що відповідний покажчик має тип, установлений модифікатором, і вказує на дані, розміщені в пам'яті згідно з даним модифікатором. Наприклад:
|
|
main{
static int far p;
static near int*x;
x=&p;
}
В останньому рядку цієї програми виникає помилка за рахунок використання даних з різною адресацією. Безпомилковий варіант:
main{
static int far p;
static far int*x;
x=&p;
}
У Microsoft C існує можливість модифікувати безпосередньо сам покажчик, тобто допускається конструкція вигляду
int*far x;
int far*far x;
int huge*near x;
У MS C, крім описаних можливостей, існує чотири спеціальні покажчики типу near:
a cs – сегмент коду;
a ds – сегмент даних;
a ss – сегмент стеку;
a es – динамічна пам'ять.
Модифікатори const, volatile,