En una computadora con arquitectura segmentada , un puntero lejano es un puntero a la memoria en un contexto específico, [1] como un selector de segmento que permite señalar direcciones fuera del segmento predeterminado.
La comparación y la aritmética en punteros lejanos son problemáticas: puede haber varios pares de direcciones de desplazamiento de segmento diferentes que apunten a una dirección física .
Por ejemplo, en un Intel 8086 , así como en procesadores posteriores que ejecutan código de 16 bits , un puntero lejano tiene dos partes: un valor de segmento de 16 bits y un valor de desplazamiento de 16 bits . Una dirección lineal se obtiene desplazando el valor del segmento binario cuatro veces hacia la izquierda y luego sumando el valor de desplazamiento. Por lo tanto, la dirección efectiva es de 21 bits [Nota 1] . Puede haber hasta 4096 pares de direcciones de segmento-desplazamiento diferentes que apuntan a una dirección física. Para comparar dos punteros lejanos, primero deben convertirse (normalizarse) a su representación lineal.
En los compiladores de C destinados a la familia de procesadores 8086, los punteros lejanos se declaraban utilizando un calificador no estándar; por ejemplo, se definía un puntero lejano a un char . La dificultad de normalizar punteros lejanos se podía evitar con el calificador no estándar. En otros compiladores se hacía utilizando un calificador igualmente no estándar. [2]far
char far *p;
huge
__far
Ejemplo de puntero lejano:
#include <stdio.h> int main () { char lejos * p = ( char lejos * ) 0x55550005 ; char lejos * q = ( char lejos * ) 0x53332225 ; * p = 80 ; ( * p ) ++ ; printf ( "%d" , * q ); devolver 0 ; }
p
es: 0x5555 * 0x10 + 0x0005 = 0x55555q
es: 0x5333 * 0x10 + 0x2225 = 0x55555p
Entonces , q
ambos apuntan a la misma ubicación 0x55555.