Tutorial de Apuntadores y Arreglos en C - Cimat
Tutorial de Apuntadores y Arreglos en C - Cimat
Tutorial de Apuntadores y Arreglos en C - Cimat
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Este tipo <strong>de</strong> variable es conocido como "variable apuntador" (por razones que esperamos result<strong>en</strong> claras un<br />
poco más tar<strong>de</strong>). En C cuando <strong>de</strong>finimos una variable <strong>de</strong> apuntador lo hacemos cuando prece<strong>de</strong>mos su<br />
nombre con un asterisco. En C a<strong>de</strong>más le damos a nuestro apuntador un tipo, el cual, <strong>en</strong> este caso, hace<br />
refer<strong>en</strong>cia al tipo <strong>de</strong> dato que se <strong>en</strong>cu<strong>en</strong>tra guardado <strong>en</strong> la dirección que alojaremos <strong>en</strong> nuestro apuntador. Por<br />
ejemplo, consi<strong>de</strong>remos la sigui<strong>en</strong>te <strong>de</strong>claración <strong>de</strong> una variable:<br />
int *ptr;<br />
ptr es el nombre <strong>de</strong> nuestra variable (tal y como k era el nombre <strong>de</strong> nuestra variable <strong>de</strong> tipo <strong>en</strong>tero).<br />
El * informa al compilador que lo que queremos es una variable apuntador, es <strong>de</strong>cir, que se reserv<strong>en</strong> los bytes<br />
necesarios para alojar una dirección <strong>en</strong> la memoria. Lo <strong>de</strong> “int” significa que queremos usar nuestra variable<br />
apuntador para almac<strong>en</strong>ar la dirección <strong>de</strong> un <strong>en</strong>tero. Se dice <strong>en</strong>tonces que dicho tipo <strong>de</strong> apuntador “apunta” a<br />
un <strong>en</strong>tero. Sin embargo, nótese que cuando escribíamos int k; no le asignamos un valor a k.<br />
Si la <strong>de</strong>claración se hace fuera <strong>de</strong> cualquier función, los compiladores ANSI la inicializarán automáticam<strong>en</strong>te a<br />
cero. De modo similar, ptr no ti<strong>en</strong>e un valor asignado, esto es, no hemos almac<strong>en</strong>ado una dirección <strong>en</strong> la<br />
<strong>de</strong>claración hecha arriba. En este caso, otra vez si la <strong>de</strong>claración fuese hecha fuera <strong>de</strong> cualquier función, es<br />
inicializado a un valor garantizado <strong>de</strong> tal manera que no apunte a un objeto <strong>de</strong> C o a una función, un apuntador<br />
inicializado <strong>de</strong> este modo es <strong>de</strong>finido como un apuntador “null”. Entonces se llama un apuntador nulo (null<br />
pointer).<br />
El patrón real <strong>de</strong> bits para un apuntador nulo, pue<strong>de</strong> o no evaluarse a cero, ya que <strong>de</strong>p<strong>en</strong><strong>de</strong> específicam<strong>en</strong>te<br />
<strong>de</strong>l sistema <strong>en</strong> que está si<strong>en</strong>do <strong>de</strong>sarrollado el código. Para hacer el código fu<strong>en</strong>te compatible <strong>en</strong>tre distintos<br />
compiladores <strong>en</strong> varios sistemas, se usa una macro para repres<strong>en</strong>tar un apuntador nulo. Este macro recibe el<br />
nombre <strong>de</strong> NULL. Así que, estableci<strong>en</strong>do el valor <strong>de</strong> un apuntador utilizando este macro, con una instrucción<br />
como ptr = NULL, garantiza que el apuntador sea un apuntador nulo. De modo similar cuando comprobamos el<br />
valor <strong>de</strong> cero <strong>en</strong> una variable <strong>en</strong>tera, como <strong>en</strong> if (k==0) po<strong>de</strong>mos comprobar un que un apuntador sea nulo<br />
usando if (ptr == NULL).<br />
Pero, volvi<strong>en</strong>do <strong>de</strong> nuevo con el uso <strong>de</strong> nuestra nueva variable ptr. Supongamos ahora que queremos<br />
almac<strong>en</strong>ar <strong>en</strong> ptr la dirección <strong>de</strong> nuestra variable <strong>en</strong>tera k. Para hacerlo hacemos uso <strong>de</strong>l operador unitario & y<br />
escribimos:<br />
ptr = &k;<br />
Lo que el operador & hace es obt<strong>en</strong>er la dirección <strong>de</strong> k, aún cuando k está <strong>en</strong> el lado <strong>de</strong>recho <strong>de</strong>l operador <strong>de</strong><br />
asignación ‘=’ y copia esa dirección <strong>en</strong> el cont<strong>en</strong>ido <strong>de</strong> nuestro apuntador ptr. Ahora, ptr es un “puntero a k”.<br />
Hay un operador más que discutir: El operador <strong>de</strong> “indirección” (o <strong>de</strong> <strong>de</strong>srefer<strong>en</strong>cia) es el asterisco y se usa<br />
como sigue:<br />
*ptr = 7;<br />
6