Tutorial de Apuntadores y Arreglos en C - Cimat
Tutorial de Apuntadores y Arreglos en C - Cimat
Tutorial de Apuntadores y Arreglos en C - Cimat
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