17.05.2013 Views

Tutorial de Apuntadores y Arreglos en C - Cimat

Tutorial de Apuntadores y Arreglos en C - Cimat

Tutorial de Apuntadores y Arreglos en C - Cimat

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!