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.
}<br />
puts("\n");<br />
/* Y aquí es don<strong>de</strong> <strong>de</strong>mostramos que efectivam<strong>en</strong>te estamos manejando un<br />
arreglo bidim<strong>en</strong>sional cont<strong>en</strong>ido <strong>en</strong> un bloque continuo <strong>de</strong> memoria */<br />
printf("Demostrando que los elem<strong>en</strong>tos son continuos <strong>en</strong> memoria:\n");<br />
pruebaptr = aptr;<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 < ncolumnas; columna++)<br />
{<br />
printf("%d ", *(pruebaptr++));<br />
}<br />
putchar('\n');<br />
}<br />
return 0;<br />
Consi<strong>de</strong>remos <strong>de</strong> nuevo el número <strong>de</strong> llamadas a malloc():<br />
Para reservar la memoria que cont<strong>en</strong>drá todo el arreglo: 1 llamada<br />
Para reservar la memoria para el arreglo <strong>de</strong> punteros: 1 llamada<br />
-------<br />
Total: 2 llamadas.<br />
Bi<strong>en</strong>, pues cada llamada a malloc() crea un gasto adicional <strong>de</strong> espacio ya que malloc() es por lo g<strong>en</strong>eral<br />
implem<strong>en</strong>tada por el sistema operativo formando una lista <strong>en</strong>lazada que conti<strong>en</strong>e los datos correspondi<strong>en</strong>tes al<br />
tamaño <strong>de</strong>l bloque. Pero lo más importante es que con arreglos gran<strong>de</strong>s (varios ci<strong>en</strong>tos <strong>de</strong> r<strong>en</strong>glones), seguirle<br />
el rastro a la memoria que <strong>de</strong>be ser liberada <strong>en</strong> algún mom<strong>en</strong>to, pue<strong>de</strong> llegar a ser <strong>en</strong>gorroso. Este último<br />
método, combinado con la conv<strong>en</strong>i<strong>en</strong>cia <strong>de</strong> la continuidad <strong>de</strong>l bloque <strong>de</strong> memoria, lo que nos permite la<br />
inicialización <strong>de</strong> todo el bloque a ceros usando memset(), haría <strong>de</strong> esta alternativa la más conv<strong>en</strong>i<strong>en</strong>te.<br />
Como ejemplo final sobre el tema <strong>de</strong> arreglos multidim<strong>en</strong>sionales, <strong>de</strong>mostraremos el alojami<strong>en</strong>to dinámico <strong>de</strong><br />
un arreglo <strong>de</strong> 3D. Este ejemplo mostrará una cosa más a t<strong>en</strong>er <strong>en</strong> cu<strong>en</strong>ta con este tipo <strong>de</strong> alojami<strong>en</strong>to. Por las<br />
razones expuestas arriba, usaremos el último método. Veamos pues el sigui<strong>en</strong>te código:<br />
PROGRAMA 9.4<br />
/* Program 9.4 from PTRTUT10.HTM 6/13/97 */<br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> <br />
int X_DIM=16;<br />
int Y_DIM=5;<br />
int Z_DIM=3;<br />
int main(void)<br />
{<br />
char *espacio;<br />
char ***Arr3D;<br />
int y, z, diff;<br />
36