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

}<br />

puts("\nError al reservar espacio para apuntadores <strong>de</strong> r<strong>en</strong>glon.\n");<br />

exit(0);<br />

printf("\n\n\nIndice Puntero(hex) Puntero(<strong>de</strong>c) Dif.(<strong>de</strong>c)");<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 />

r<strong>en</strong>glonptr[r<strong>en</strong>glon] = malloc(ncolumnas * sizeof(int));<br />

if (r<strong>en</strong>glonptr[r<strong>en</strong>glon] == NULL)<br />

{<br />

printf("\nError al reservar memoria para el r<strong>en</strong>glon[%d]\n",r<strong>en</strong>glon);<br />

exit(0);<br />

}<br />

printf("\n%d %p %d", r<strong>en</strong>glon, r<strong>en</strong>glonptr[r<strong>en</strong>glon],<br />

r<strong>en</strong>glonptr[r<strong>en</strong>glon]);<br />

if (r<strong>en</strong>glon > 0)<br />

printf(" %d",((int)r<strong>en</strong>glonptr[r<strong>en</strong>glon] –<br />

(int)r<strong>en</strong>glonptr[r<strong>en</strong>glon-1]));<br />

}<br />

}<br />

return 0;<br />

En el código <strong>de</strong> arriba, r<strong>en</strong>glonptr es un apuntador a apuntador <strong>de</strong> tipo <strong>en</strong>tero. En este caso, apunta al primer<br />

elem<strong>en</strong>to <strong>de</strong> un arreglo <strong>de</strong> apuntadores <strong>de</strong>l tipo int. Consi<strong>de</strong>remos el número <strong>de</strong> llamadas a malloc():<br />

Para obt<strong>en</strong>er nuestro arreglo <strong>de</strong> apuntadores: 1 llamada<br />

Para obt<strong>en</strong>er espacio para los r<strong>en</strong>glones: 5 llamadas<br />

-------<br />

Total: 6 llamadas.<br />

Si optas por este método, observa que mi<strong>en</strong>tras pue<strong>de</strong>s usar la notación <strong>de</strong> arreglos para acce<strong>de</strong>r a elem<strong>en</strong>tos<br />

individuales <strong>de</strong>l arreglo, por ejemplo: r<strong>en</strong>glonptr[r<strong>en</strong>glon][columna] = 17;, esto no significa que los<br />

datos <strong>en</strong> el arreglo bidim<strong>en</strong>sional sean continuos <strong>en</strong> memoria.<br />

Pue<strong>de</strong>s, sin embargo, usar la notación <strong>de</strong> arreglos tal y como si los datos se <strong>en</strong>contraran <strong>en</strong> un bloque continuo<br />

<strong>de</strong> memoria. Por ejemplo, pue<strong>de</strong>s escribir:<br />

r<strong>en</strong>glonptr[r<strong>en</strong>glon][columna] = 176;<br />

tal y como se haría si r<strong>en</strong>glonptr fuera el nombre <strong>de</strong> un arreglo bidim<strong>en</strong>sional creado <strong>en</strong> tiempo <strong>de</strong> compilación.<br />

Por supuesto que los valores <strong>de</strong> [r<strong>en</strong>glon] y [columna] <strong>de</strong>b<strong>en</strong> estar <strong>de</strong>ntro <strong>de</strong> los límites establecidos <strong>de</strong>l<br />

arreglo que se ha creado, igual que con un arreglo creado <strong>en</strong> tiempo <strong>de</strong> compilación.<br />

Si lo que queremos es t<strong>en</strong>er un bloque continuo <strong>de</strong> memoria <strong>de</strong>dicado al almac<strong>en</strong>ami<strong>en</strong>to <strong>de</strong> los elem<strong>en</strong>tos <strong>de</strong>l<br />

arreglo, pue<strong>de</strong> hacerse <strong>de</strong>l sigui<strong>en</strong>te modo:<br />

METODO 4:<br />

Con este método reservamos un bloque <strong>de</strong> memoria para cont<strong>en</strong>er primero el arreglo completo.<br />

Después creamos un arreglo <strong>de</strong> apuntadores para apuntar a cada r<strong>en</strong>glón. Así, aunque estamos usando un<br />

arreglo <strong>de</strong> punteros, el arreglo real <strong>en</strong> memoria es continuo. El código es este:<br />

34

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

Saved successfully!

Ooh no, something went wrong!