<div dir="ltr">Hola Edwin,<div class="gmail_extra"><br><div class="gmail_quote">2013/9/18 Edwin Alexander Bohorquez Gamba <span dir="ltr"><<a href="mailto:edwinprogramacion@hotmail.es" target="_blank">edwinprogramacion@hotmail.es</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">


<div><div dir="ltr"><div>Hola,  tengo una pregunta a cerca de punteros y es la siguiente:</div><div>Por favor corrijanme si lo que digo esta mal: </div></div></div></blockquote><div><br></div><div>Muy bien; así lo haremos.</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"><div><div dir="ltr"><div>--------------------------------------------------------</div>
<div>Pasamos un apuntador por valor:</div><div><br></div></div></div></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">
<div><div dir="ltr"><div></div><div>--------------------------------------------------------<br></div><div>Pasamos un apuntador por referencia: </div></div></div></blockquote><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">
<div><div dir="ltr"><div> <br></div></div></div></blockquote><div><br></div><div><div>Correcto.</div></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">
<div><div dir="ltr"><div></div><div>--------------------------------------------------------</div><div>Pero me surge una duda:</div><div><br></div><div>struct lista{</div><div>//miembros..</div><div>};</div><div><br></div>
<div>¿ Esta es una forma de pasar un apuntador por referencia o por valor?</div><div>void funcion( lista   **nuevo ){</div></div></div></blockquote><div><br></div><div>Técnicamente, pasamos la dirección de memoria del puntero (o apuntador) por valor. Es decir, copiamos la dirección de memoria del puntero a 'nuevo'. En tu ejemplo, el resultado es:</div>
<div><br></div><div>lista **nuevo = &puntero;</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">
<div><div dir="ltr"><div>//realiza alguna operacion...</div><div>}</div><div><br></div><div>int main()</div><div>{</div><div>lista  *puntero;</div><div>//...</div><div>funcion( &puntero );</div><div>}</div><div><br></div>
<div>que sentido tiene recibir como parametro un doble apuntador ?</div></div></div></blockquote><div><br></div><div>En C, al no haber paso por referencia, la manera de emular tal comportamiento es pasando la dirección de memoria de la variable. En C++, no es tan necesario hacer esto para el mismo caso, porque tenemos el paso por referencia.</div>
<div><br></div><div>Ahora bien, el uso importante del puntero en C/C++ es con el tema de la adjudicación dinámica de memoria. Por ejemplo,</div><div><br></div><div>void func( int **ptr, int nFilas, int nCols );</div><div>
...</div><div>// Tabla de N x M<br></div><div>int **pTabla = new int*[N];</div><div><br></div><div>for( int i=0; i<N; i++ )<br>  pTabla[i] = new int[M];<br><br>func( pTabla, N, M );</div><div><br></div><div>Lo mismo podríamos decir de una "tabla 3D". La idea es que un puntero apunta - valga la redundancia - a un array de punteros, los cuales apuntan a sus respectivos arrays de punteros, y así sucesivamente. Por ejemplo,</div>
<div><br></div><div>int *****************ptr;</div><div><br></div><div>ptr = new int ****************[10];</div><div><br></div><div>ptr[0] = new int ***************[5];</div><div>ptr[1] = new int ***************[15];</div>
<div>ptr[2] = new int ***************[20];</div><div>...</div><div>ptr[0][0] = new int **************[50];<br></div><div>ptr[0][1] = new int **************[25];<br>...</div><div><br></div><div>Obviamente, es un ejemplo extremo, pero válido.</div>
<div><br></div><div><br></div><div>Otro uso importante en C++ es cuando queremos manipular objetos polimórficos. Un doble puntero aparecería si queremos una lista de objetos polimórficos. Por ejemplo,</div><div><br></div>
<div>class Base</div><div>{<br>public:<br>  virtual ~Base();</div><div>...</div><div>};</div><div><br></div><div><div>class Der : public Base  {...};</div></div><div>...</div><div><br></div><div>Base **pLista = new Base*[10];</div>
<div><br></div><div>pLista[0] = new Base;</div><div>pLista[1] = new Der;<br></div><div>pLista[2] = new Der;<br></div><div>pLista[3] = new Base;<br></div><div>pLista[4] = new Base;<br></div><div><br></div><div>Si pasamos el array a una  función, tendremos que pasar un doble puntero, aunque en realidad se trata de un puntero a un objeto polimórfico, el cual se representa como un puntero a una clase base.</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"><div><div dir="ltr"><div>y que aplicaciones tienen los apuntadores dobles en las listas enlazadas ?</div>
</div></div></blockquote><div><br></div><div>En C++, no son necesarios para implementar una lista enlazada.</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">
<div><div dir="ltr"><div>-------------------------------------------------------------------------------------------------------------</div><div>Me podrian explicar como manejar los apuntadores dobles ?, por ejemplo: </div>
<div><br></div><div>int main()</div><div>{</div><div>int a=10;</div><div>int **ptr;</div><div>*ptr = &a;</div></div></div></blockquote><div><br></div><div>Esto es peligroso, porque 'ptr' no apunta a nada deseado. Deberíamos crear memoria o apuntar a un puntero que ya exista. Por ejemplo,</div>
<div><br></div><div>int **ptr = new int*;</div><div>*ptr = &a;</div><div><br></div><div>O si lo prefieres,</div><div><br></div><div>int *pa = &a;</div><div>int **ptr = &pa;</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">
<div><div dir="ltr"><div>**ptr = **p + 5;</div></div></div></blockquote><div><br></div><div>Sospecho que querías escribir:<br><br>**ptr = **ptr + 5;</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">
<div><div dir="ltr"><div>cout<<ptr<<"\n";</div><div>cout<<*ptr<<"\n";</div><div>cout<<**ptr<<"\n";</div><div>system("pause");</div><div>}</div><div>
Veo que para este tipo de apuntadores, la forma de manipular el contenido es con:  **ptr; </div><div>y para manipular la direccion es *p . Por favor me podrian aclarar este ejemplo?</div><div><br></div></div></div></blockquote>
<div><br></div><div>La variable 'ptr' guarda la dirección de memoria de un puntero, previamente creado. Piensa que un puntero implica un nivel de indirección, porque indirectamente tratamos el valor guardado en memoria. Por lo tanto, un doble puntero supone dos niveles de indirección; triple puntero implica tres niveles, y así sucesivamente.</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"><div><div dir="ltr"><div></div><div>De antemano muchas Gracias por su respuesta y por el Curso de C++ .</div>
<div>Gracias  Steven R. Davidson, y Salvador Pozo por sus grandes aportes a la programacion.</div><div><br></div>                                           </div></div>
</blockquote></div><br></div><div class="gmail_extra">De nada; para eso estamos :)</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Espero que todo esto aclare las dudas.</div>
<div class="gmail_extra"><br></div><div class="gmail_extra">Steven</div><div class="gmail_extra"><br></div></div>