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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

conocer las otras dim<strong>en</strong>siones <strong>de</strong>p<strong>en</strong><strong>de</strong> <strong>de</strong> la forma <strong>en</strong> que escribamos el código. Vamos a discutir sobre varios<br />

métodos <strong>de</strong> asignarle espacio dinámicam<strong>en</strong>te a arreglos bidim<strong>en</strong>sionales <strong>de</strong> <strong>en</strong>teros. Para com<strong>en</strong>zar<br />

consi<strong>de</strong>remos el caso <strong>en</strong> que la segunda dim<strong>en</strong>sión es conocida <strong>en</strong> tiempo <strong>de</strong> compilación:<br />

METODO 1:<br />

Una manera <strong>de</strong> <strong>en</strong>fr<strong>en</strong>tar este problema es usando la palabra clave type<strong>de</strong>f. Para alojar arreglos <strong>de</strong> 2<br />

dim<strong>en</strong>siones, recor<strong>de</strong>mos que las sigui<strong>en</strong>tes dos notaciones dan como resultado la g<strong>en</strong>eración <strong>de</strong>l mismo<br />

código objeto:<br />

multi[r<strong>en</strong>glon][columna] = 1; *(*(multi + r<strong>en</strong>glon) + columna) = 1;<br />

También es cierto que las sigui<strong>en</strong>tes dos notaciones dan el mismo resultado:<br />

multi[r<strong>en</strong>glon] *(multi + r<strong>en</strong>glon)<br />

Ya que la que está a la <strong>de</strong>recha <strong>de</strong>be evaluarse a un apuntador, la notación <strong>de</strong> arreglos a la izquierda <strong>de</strong>be<br />

hacerlo también. De hecho multi[0] retornará un puntero al primer <strong>en</strong>tero <strong>en</strong> el primer r<strong>en</strong>glón, multi[1] un<br />

puntero al primer <strong>en</strong>tero <strong>de</strong>l segundo r<strong>en</strong>glón, etc. En realidad multi[n] se evalúa como un puntero a ese<br />

arreglo <strong>de</strong> <strong>en</strong>teros que conforma el n-ésimo r<strong>en</strong>glón <strong>de</strong> nuestro arreglo bidim<strong>en</strong>sional. Esto significa que<br />

po<strong>de</strong>mos p<strong>en</strong>sar <strong>en</strong> multi como un arreglo <strong>de</strong> arreglos y multi[n] como un puntero al n-ésimo arreglo <strong>de</strong> este<br />

arreglo <strong>de</strong> arreglos. Aquí la palabra puntero (apuntador) es usada para repres<strong>en</strong>tar el valor <strong>de</strong> una dirección.<br />

Mi<strong>en</strong>tras que este uso es común <strong>en</strong> los libros, al leer instrucciones <strong>de</strong> este tipo, <strong>de</strong>bemos ser cuidadosos al<br />

distinguir <strong>en</strong>tre la dirección constante <strong>de</strong> un arreglo y una variable apuntadora que es un objeto que conti<strong>en</strong>e<br />

datos <strong>en</strong> si misma.<br />

Veamos ahora el:<br />

PROGRAMA 9.1<br />

/* Program 9.1 from PTRTUT10.HTM 6/13/97 */<br />

#inclu<strong>de</strong> <br />

#inclu<strong>de</strong> <br />

#<strong>de</strong>fine COLUMNAS 5<br />

type<strong>de</strong>f int Arreglo_<strong>de</strong>_r<strong>en</strong>glones[COLUMNAS];<br />

Arreglo_<strong>de</strong>_r<strong>en</strong>glones *rptr;<br />

int main(void)<br />

{<br />

int nr<strong>en</strong>glones = 10;<br />

int r<strong>en</strong>glon, columna;<br />

rptr = malloc(nr<strong>en</strong>glones * COLUMNAS * sizeof(int));<br />

for (r<strong>en</strong>glon = 0; r<strong>en</strong>glon < nr<strong>en</strong>glones; r<strong>en</strong>glon++)<br />

{<br />

for (columna = 0; columna < COLUMNAS; columna++)<br />

{<br />

rptr[r<strong>en</strong>glon][columna] = 17;<br />

}<br />

}<br />

}<br />

return 0;<br />

32

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

Saved successfully!

Ooh no, something went wrong!