<div dir="ltr">Hola Marving,<div class="gmail_extra"><br><div class="gmail_quote">2014-04-03 9:29 GMT-04:00 Marving <span dir="ltr"><<a href="mailto:jr.marving@gmail.com" target="_blank">jr.marving@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hola Steven<br>
Gracias por tu rápida respuesta.<br>
La verdad es que no se aclararon mis dudas. Pero no te preocupes no fue debido<br>
a tu explicación. No comprendía nada de tu contestación, ayer.<br></blockquote><div><br></div><div>Es normal. Esto de los punteros es un tema difícil de roer, incluso para veteranos.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

Entendía la arrays de dos dimensiones, pero no manejaba los punteros para este tipo de arrays.<br>
Partiendo de esto<br>
int vector[4];<br>
int array_2D[3][4]<br>
<br>
A veces asociaba la idea de vector, como puntero de arrays de 5 enteros.<br></blockquote><div><br></div><div>Bueno, son 4 enteros, según el ejemplo.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

Seguidamente, array_2D, era para mi un puntero a un array de dos dimensiones.<br>
Parece ser que estaba equivocado.<br>
<br></blockquote><div><br></div><div>Correcto.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

Lo cierto parece ser que es<br>
vector es simplemente un puntero a un entero. Apunta a los elementos del array<br></blockquote><div><br></div><div>No tiene por qué ser un array; puede ser simplemente un solo entero. Es cierto que podemos usar tal 'vector' como puntero al primer entero de un array de enteros siguientes.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
array_2D es un puntero a arrays unidimensionales de 4 elementos<br></blockquote><div><br></div><div>Técnicamente, esto no es cierto.</div><div><br></div><div>'array_2D' es una dirección de memoria al primer elemento del array; o sea, al primer entero.</div>
<div><br></div><div><br></div><div>La realidad de la situación es que el compilador hace algunas cosas implícitamente para nosotros al usar arrays. Por ejemplo,</div><div><br></div><div>int matriz[3][3] = { {0} };</div><div>
<br></div><div>matriz[0][0] = matriz[1][1] = matriz[2][2] = 1;</div><div><br></div><div>Aquí, 'matriz' es una dirección de memoria al primer entero de nueve que existen contiguamente en memoria, que el compilador gestionará. Para entender lo que ocurre, es mejor ver un vector descriptor de lo que ocurre en memoria:</div>
<div><br></div><div>Dirección de</div><div>Memoria           Tipo          Nombre           Valor          Misceláneo</div><div>-------------------------------------------------------------------------------------------------------</div>
<div>0x44EEAA00    int             -----                 0               ( matriz[0][0] )</div><div><div>0x44EEAA04    int             -----                 0               ( matriz[0][1] )</div></div><div><div>0x44EEAA08    int             -----                 0               ( matriz[0][2] )</div>
<div>0x44EEAA0B    int             -----                 0               ( matriz[1][1] )</div></div><div>...</div><div><div>0x44EEAA1C    int             -----                 0               ( matriz[2][1] )</div><div>0x44EEAA20    int             -----                 0               ( matriz[2][2] )</div>
</div><div><br></div><div>No se guarda ninguna dirección de memoria (en memoria) y por lo tanto, no hay punteros.</div><div><br></div><div>Al acceder a los elementos, el compilador se fijará en los tipos de datos y realizará los cálculos implícitamente. Por ejemplo, matriz[2][2] implica el siguiente cálculo,</div>
<div><br></div><div>int => 4 bytes</div><div><br></div><div>Por lo que obtenemos,</div><div><br></div><div>matriz + (2 * 3 + 2) * 4  =  matriz + 32</div><div><br></div><div>que en el ejemplo anterior significa,</div><div>
<br></div><div>0x44EEAA00 + 32  =  0x44EEAA20<br></div><div><br></div><div><br></div><div>Ahora bien, las cosas se ponen peliagudas cuando pasamos arrays por parámetro a las funciones. Para hacer esto, el compilador no crea un array, sino que crea un puntero. Como un puntero y un array gestionan direcciones de memoria, es lógico que exista una relación estrecha entre ambos conceptos. Por lo tanto, se crea un puntero (parámetro local) a partir del array (parámetro original). Por ejemplo,</div>
<div><br></div><div>void func( int m[][3] );</div><div>...</div><div>func( matriz );</div><div><br></div><div>Realmente, 'm' es un puntero, que guarda la dirección de memoria que ES el array, 'matriz'. Dicho esto, podríamos haber escrito,</div>
<div><br></div><div><div>void func( int (*m)[3] );</div></div><div><br></div><div>aunque claro está, el uso de 'm' sería diferente al ser un tipo de puntero, y además, podríamos hacer que 'm' apuntase a otra dirección de memoria; cosa que seguramente no nos interesaría.</div>
<div><br></div><div>Los cálculos de la dirección de memoria siguen siendo los mismos presentados anteriormente en el caso de un array "normal".</div><div><br></div><div><br></div><div>Por último, quiero dejar claro que un puntero no es igual que un array. Como mencioné antes, existe una relación entre punteros y arrays, por lo que podemos tratarlos de manera parecida, e incluso convertir uno a otro.</div>
<div><br></div><div><br></div><div>Espero haber aclarado un poco más el tema.</div><div><br></div><div>Steven</div><div><br></div></div></div></div>