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.

}<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

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

Saved successfully!

Ooh no, something went wrong!