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.

* Primeram<strong>en</strong>te reservamos el espacio necesario para el arreglo completo */<br />

espacio = malloc(X_DIM * Y_DIM * Z_DIM * sizeof(char));<br />

/* <strong>en</strong>seguida reservamos el espacio para un arreglo <strong>de</strong> apuntadores, los cuales<br />

ev<strong>en</strong>tualm<strong>en</strong>te apuntaran cada uno al primer elem<strong>en</strong>to <strong>de</strong> un arreglo bidim<strong>en</strong>sional<br />

<strong>de</strong> apuntadores a apuntadores */<br />

Arr3D = malloc(Z_DIM * sizeof(char **));<br />

/* para cada uno <strong>de</strong> estos asignamos un apuntador a un reci<strong>en</strong><br />

asignado arreglo <strong>de</strong> apuntadores a r<strong>en</strong>glon */<br />

for (z = 0; z < Z_DIM; z++)<br />

{<br />

Arr3D[z] = malloc(Y_DIM * sizeof(char *));<br />

/* y para cada espacio <strong>de</strong> este arreglo, colocados un apuntador el primer elem<strong>en</strong>to<br />

<strong>de</strong> cada r<strong>en</strong>glon es el espacio <strong>de</strong>l arreglo originalm<strong>en</strong>te alojado */<br />

}<br />

for (y = 0; y < Y_DIM; y++)<br />

{<br />

Arr3D[z][y] = espacio + (z*(X_DIM * Y_DIM) + y*X_DIM);<br />

}<br />

/* Y, ahora, revisamos cada direccion <strong>en</strong> nuestro arreglo 3D para comprobar que los<br />

indices <strong>de</strong> nuestro apuntador Arr3d est<strong>en</strong> alojados <strong>de</strong> manera continua <strong>en</strong> memoria */<br />

for (z = 0; z < Z_DIM; z++)<br />

{<br />

printf("Direccion <strong>de</strong>l arreglo %d es %ph\n", z, *Arr3D[z]);<br />

for ( y = 0; y < Y_DIM; y++)<br />

{<br />

printf("El arreglo %d y el r<strong>en</strong>glon %d comi<strong>en</strong>zan <strong>en</strong> %ph", z, y,<br />

Arr3D[z][y]);<br />

diff = Arr3D[z][y] - espacio;<br />

printf(" dif = %ph ",diff);<br />

printf(" z = %d y = %d\n", z, y);<br />

}<br />

}<br />

return 0;<br />

}<br />

Si has seguido este tutorial hasta este punto no <strong>de</strong>bes t<strong>en</strong>er problemas <strong>de</strong>scifrando el código <strong>de</strong>l programa <strong>de</strong><br />

arriba basándote <strong>en</strong> los com<strong>en</strong>tarios. Hay un par <strong>de</strong> cuestiones que explicar <strong>de</strong> todos modos, com<strong>en</strong>cemos por<br />

la línea que dice:<br />

Arr3D[z][y] = espacio + (z*(X_DIM * Y_DIM) + y*X_DIM);<br />

Observa que aquí espacio es un apuntador <strong>de</strong> tipo caracter, que es el mismo tipo que Arr3D[z][y]. Es<br />

importante que, al agregar un <strong>en</strong>tero, como el obt<strong>en</strong>ido por la evaluación <strong>de</strong> la expresión (z*(X_DIM *<br />

Y_DIM) + y * X_DIM), a un apuntador, el resultado es un nuevo valor <strong>de</strong> apuntador. Y cuando asignamos<br />

valores <strong>de</strong> apuntador a variables apuntadoras, los tipos <strong>de</strong> datos <strong>de</strong>l valor y <strong>de</strong> la variable <strong>de</strong>b<strong>en</strong> coincidir.<br />

37

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

Saved successfully!

Ooh no, something went wrong!