This article needs additional citations for verification. (February 2024) |
В компьютере с сегментированной архитектурой дальний указатель — это указатель на память в определенном контексте [1] , например, селектор сегмента, позволяющий указывать на адреса за пределами сегмента по умолчанию.
Сравнение и арифметика для дальних указателей проблематичны: может быть несколько различных пар адресов сегмент-смещение, указывающих на один физический адрес .
Например, в Intel 8086 , а также в более поздних процессорах, работающих с 16-битным кодом, дальний указатель состоит из двух частей: 16-битного значения сегмента и 16-битного значения смещения . Линейный адрес получается путем сдвига двоичного значения сегмента четыре раза влево с последующим добавлением значения смещения. Следовательно, эффективный адрес составляет 21 бит [Примечание 1] . Может быть до 4096 различных пар адресов сегмент-смещение, указывающих на один физический адрес. Чтобы сравнить два дальних указателя, их необходимо сначала преобразовать (нормализовать) в их линейное представление.
На компиляторах C , ориентированных на семейство процессоров 8086, дальние указатели объявлялись с использованием нестандартного квалификатора; например, определялся дальний указатель на char . Трудности нормализации дальних указателей можно было избежать с помощью нестандартного квалификатора. На других компиляторах это делалось с использованием столь же нестандартного квалификатора. [2]far
char far *p;
huge
__far
Пример дальнего указателя:
#include <stdio.h> int main () { char far * p = ( char far * ) 0x55550005 ; char far * q = ( char far * ) 0x53332225 ; * p = 80 ; ( * p ) ++ ; printf ( "%d" , * q ); return 0 ; }
p
: 0x5555 * 0x10 + 0x0005 = 0x55555q
: 0x5333 * 0x10 + 0x2225 = 0x55555p
Итак , q
оба указывают на одно и то же место 0x55555.