Está en la página 1de 1

TIPOS DE APUNTADORES Y ARREGLOS

Consideremos el por qu tenemos que identificar el "tipo" de variable a la que apunta un puntero
como en: int *ptr; una de las razones para hacer esto es que una vez que ptr apunta a algo y si
escribimos: *ptr = 2; el compilador sabr cuantos bytes va a copiar en la posicin de memoria a la
que apunta ptr. Si ptr fuera declarado como un puntero a entero, se copiaran 4 bytes.
De modo similar para nmeros de punto flotante (float) y enteros dobles (doubles), se copiara el
nmero apropiado de bytes. Pero definir el tipo al que el apuntador apunta permite un cierto
nmero de maneras interesantes en que el compilador puede interpretar el cdigo. Digamos que
ahora apuntamos nuestro apuntador entero ptr al primero de estos nmeros enteros.
Es ms, supongamos que este primer entero est almacenado en la posicin de memoria 100
(decimal). Entonces qu pasa cuando escribimos: ptr + 1; ya que el compilador sabe que este es
un apuntador (que su valor es una direccin de memoria) y que apunta a un entero (su direccin
actual: 100, es la direccin donde se aloja un entero), aade 4 a ptr en lugar de 1, as que ptr apunta
al siguiente entero, en la posicin de memoria 104. Similarmente, si ptr fuera declarado como
apuntador a entero corto, aadira 2 en lugar de 1.
Lo mismo va para los otros tipos de datos como flotantes, dobles o an tipos definidos por el
usuario como estructuras.
Igualmente, como ++ptr y ptr++ son equivalentes a ptr + 1 (aunque el momento en el programa
cuando ptr es incrementado sea diferente), incrementar un apuntador usando el operador unitario
de incremento ++, ya sea pre- o post-, incrementa la direccin por la cantidad sizeof (tipo)3 donde
tipo es el tipo de objeto al que se apunta (por ejemplo 4 si se trata de un entero).
Y ya que un bloque de 10 enteros acomodados contiguamente en la memoria es, por definicin, un
arreglo de enteros, esto nos revela una interesante relacin entre arreglos y apuntadores.
Consideremos lo siguiente: int mi_arreglo[] = {1,23,17,4,-5,100}; en C, el estndar establece que
donde usemos &nombre_de_la_variable[0] podemos reemplazarle con nombre_de_la_variable, esto
en el cdigo de ejemplo lo que escribimos como: ptr = &mi_arreglo[0]; podemos escribirlo como:
ptr = mi_arreglo; y obtenemos el mismo resultado.
Esto conduce a muchos textos a decir que el nombre de un arreglo es un apuntador.
Si bien esto es cierto, el nombre de un arreglo es la direccin del primer elemento que contiene
el arreglo.
Es posible que el tamao de un apuntador vare dependiendo del tipo de datos del objeto al que
apunta. As que al igual que con los enteros donde podemos tener problemas al asignar, por
ejemplo un valor entero largo a una variable del tipo entero corto, podemos igualmente
encontrarnos con problemas al intentar asignar valores desde un cierto tipo de apuntador a un
apuntador de otro tipo.
C nos ofrece un apuntador de tipo void (carente de tipo). Podemos declarar un apuntador de este
tipo al escribir algo como: void *vptr; un apuntador void es una especie de apuntador genrico. Por
ejemplo, mientras C no permite la comparacin entre un apuntador del tipo entero con uno del
tipo caracter, cada uno de estos puede ser comparado con un apuntador del tipo void.

También podría gustarte