<div dir="ltr">Hola Edwin,<br><div class="gmail_extra"><br>2013/2/1 Edwin Alexander Bohorquez Gamba <span dir="ltr"><<a href="mailto:edwinprogramacion@hotmail.es" target="_blank">edwinprogramacion@hotmail.es</a>></span><br>
<div class="gmail_quote"><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 class="h5">
<div><br></div></div></div></div></div></blockquote><div><br></div><div style>[CORTE]</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 class="h5"><div>Si en este ejemplo se esta pasando un puntero por valor, no entiendo porque las modificaciones se conservan al abandonar la funcion?. Lo digo porque la salida del programa es :</div>
<div>Variable a :150   </div><div>Variable *p : 150  //esta salida no la entiendo, si los cambios en el propio puntero son locales y no se conservan al regresar, la salida no deberia quedar:  Variable *p : 100 ?.</div><div>
<br></div></div></div></div></div></blockquote><div><br></div><div style>Recuerda que estamos enviando la variable de tipo puntero, 'p', como parámetro y no la variable del entero, 'a'. Al entrar en la función, creamos la variable, 'q', que es una copia del parámetro original 'p'. El comportamiento es el siguiente:<br>
<br><br>int a = 100;</div><div style>int *p = &a;</div><div style><br></div><div style>// Invocamos: <span style="font-family:arial,sans-serif;font-size:12.727272033691406px">funcion(p)</span><br>int *q = p;  // Copiamos el parámetro</div>
<div style>*q += 50;</div><div style>// Terminamos de invocar: <span style="font-family:arial,sans-serif;font-size:12.727272033691406px">funcion(p)</span></div><div style><br></div><div style><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">cout << "Variable a: " << a << endl; </span><br>
</div><div style>cout << <span style="font-family:arial,sans-serif;font-size:12.727272033691406px">"Variable *p: " << *p << endl;</span></div><div style><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br>
</span></div><div style><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></span></div><div style><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">Como puedes ver, 'p' no cambia, pero nada impide que la variable apuntada por 'p' sea modificada, que es justamente lo que ha ocurrido en este ejemplo. A través de 'q', podemos cambiar el entero apuntado, pero no podemos cambiar el valor de 'p', porque 'q' es una copia de 'p'. Te pongo otro ejemplo,</span></div>
<div style><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></span></div><div style><div style="font-family:arial,sans-serif;font-size:12.727272033691406px"><div style="font-family:arial;font-size:small">
<div style="font-family:arial,sans-serif;font-size:12.727272033691406px">void funcion( int *q )</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">{</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
  *q += 50; </div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">  ++q;</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">}</div><div><br></div><div><br></div><div style>
Aquí modificamos el valor de la variable apuntada por 'q' y luego incrementamos 'q' - modificando su valor - para que apunte al "siguiente" entero en memoria. Sin embargo, el parámetro original, 'p', no es modificado, porque pasamos 'p' por copia.</div>
<div><br></div></div></div></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 class="h5"><div></div><div>Y la otra pregunta es: Usando el mismo codigo, pero ahora pasando el puntero por referencia, porque la salida del programa es la misma?, si en el anterior se paso por valor y en este por referencia, porque los resultados son iguales?</div>
<div><br></div></div></div></div></div></blockquote><div><br></div><div style>Esto es porque no hemos cambiado la implementación de 'funcion()'; es decir, seguimos modificando el valor de la variable apuntada por 'q' - y por 'p'. Como no modificamos el valor de 'q', el valor de 'p' no se ve alterado y por tanto, seguimos apuntando a la misma variable, 'a'. Lo puedes ver claramente aquí,</div>
<div style><br></div><div style><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">void funcion( int * &q )</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">{</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
  *q += 50; </div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">}</div></div><div><br></div><div style>Ahora bien, si cambiamos lo anterior por esto:<br><br><div style="font-size:12.727272033691406px;font-family:arial,sans-serif">
void funcion( int *q )</div><div style="font-size:12.727272033691406px;font-family:arial,sans-serif">{</div><div style="font-size:12.727272033691406px;font-family:arial,sans-serif">  *q += 50; </div><div style="font-size:12.727272033691406px;font-family:arial,sans-serif">
  ++q;</div><div style="font-size:12.727272033691406px;font-family:arial,sans-serif">}</div><div style="font-size:12.727272033691406px;font-family:arial,sans-serif"><br></div><div style="font-size:12.727272033691406px;font-family:arial,sans-serif">
Entonces, 'p' se verá modificado, apuntando al siguiente entero en memoria. Obviamente, no aconsejo hacer esto tal y como esté escrito en el ejemplo, porque no hay ningún "entero" que controlemos, así que puede haber problemas durante la ejecución del programa. Pero, podríamos hacer este cambio</div>
</div><div><br></div><div style><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">int main()</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">{</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
  int a[10] = { 100, 200 };</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">  int *p = a;  // o incluso, int *p = &a[0];</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
  funcion( p );</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">  cout << "Variable a: " << a << endl;</div>
<div style="font-family:arial,sans-serif;font-size:12.727272033691406px">  cout << "Variable *p: " << *p << endl;</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br>
</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">  return 0;</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">}</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
 </div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">void funcion( int * &q )</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">{</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
  *q += 50;</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">  ++q;</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">}</div></div><div><br></div><div>Debería aparecer en pantalla:<br>
<br>Variable a: 101</div><div style>Variable *p: 200<br></div><div><br></div><div style>Recuerda que una variable de tipo  puntero sigue siendo una variable. Las reglas para pasar variables o valores por parámetro son las mismas irrelevantemente del tipo de variable o valor. Si pasamos el valor de tipo 'int', las reglas son las mismas que si pasamos el valor de tipo 'int ***'.</div>
<div><br></div><div><br></div><div style>Espero que esto aclare las dudas.</div><div style><br></div><div style>Steven</div><div style><br></div></div></div></div>