Entiendo la confusión aquí. Los conceptos de "pasar por valor" y "pasar por referencia" no son tan claros, incluso si parecen ser así. Tenga en cuenta que la computadora no conoce estos conceptos y no se comporta de acuerdo con ella. La computadora no sabe acerca de los tipos. Por lo tanto, no hace una distinción de punteros y valores. Voy a tratar de explicar por e ejemplo:
void func1(int x)
{
x = 5;
}
void func2(int *x)
{
int a;
x = &a;
}
El funcionamiento es el mismo para la máquina en ambas funciones: Se pone el argumento y lo cambia. Tenga en cuenta que, en la segunda función no modifica * x, modifica x.
Ahora bien, si nos llaman a estas funciones,
int y = 10;
func1(y); //value of y does not change
func2(&y); //value of &y does not change, but the value of the address which y points may change.
Yo prefiero decir que, básicamente , cada llamada a la función es "llamada por valor". Pero en el caso de un tipo de puntero, tenemos una forma de cambiar el contenido de otra dirección en la memoria.
Si hubiéramos escrito func2
como
void func2(int *x)
{
*x = 5;
}
Entonces, esto sería un caso real de "llamadas por referencia".
El puntero se pasa por valor, pero el objeto apuntado por el puntero se puede modificar mediante la función (dependiendo de la cualificación de const). – dreamlax