¡Buenas!
Lo anterior solo funciona en C++.
Si quieres modificar un parámetro en C tienes que utilizar punteros (también funciona en C++, pero como ya han dicho ahí tienes referencias a variables).
Por si no sabes lo que es un puntero, es un tipo de variable que almacena una dirección de memoria.
Por ejemplo:
int x=5;
int *ptr_x;
ptr_x = &x;
Imagina la siguiente situación en tu RAM:
x ptr_x
7 8 9 10 ... 103 104 105 106
----|----|----|----| ... |----|----|----|----|
| | | | ... | | | | |
----|----|----|----| ... |----|----|----|----|
En este caso tenemos que la variable
x empieza en la posición de memoria 7 y
ptr_x empieza en la posición de memoria 103 (la RAM es como un conjunto de "apartamentos" de variables en el que cada una tiene su dirección, el nombre de una variable es una forma de no tener que estar recordando todo el tiempo donde se han almacenado los datos)
En el código anterior tenemos dos variables, una de ellas un entero
x, y otra de tipo puntero a entero
ptr_x. El puntero se declara utilizando un asterisco. En la asignación
ptr_x = &x aparece otro operador relacionado con punteros y direcciones de memoria
&. Este operador devuelve la dirección de memoria de la variable con la que se utiliza, en este caso estamos obteniendo la dirección de la variable
x y la estamos guardando en ptr_x. Asi que el código anterior nos daría el siguiente resultado:
x ptr_x
7 8 9 10 ... 103 104 105 106
----|----|----|----| ... |----|----|----|----|
0| 0| 0| 5| ... | 0| 0| 0| 7|
----|----|----|----| ... |----|----|----|----|
Y ahora entra el juego el último operador relacionado con los punteros, de nuevo el asterisco. Cuando se utiliza un asterisco con un puntero en cualquier parte del código que no se una declaración, lo que se hace es decirle al programa que trabaje con la variable que está en la dirección de memoria contenida en el puntero. Por ejemplo:
*ptr_x = 15
Ahí le estamos diciendo al programa que coja la variable que está en la dirección de memoria contenida en en el valor de
ptr_x y le asigne el valor 15. En este caso toma la variable que está en la posición de memoria 7 (que corresponde a
x porque a
ptr_x le hemos asignado la posición en la RAM de la variable
x) y le asigna el valor 15, con lo que la RAM quedaría:
x ptr_x
7 8 9 10 ... 103 104 105 106
----|----|----|----| ... |----|----|----|----|
0| 0| 0| 15| ... | 0| 0| 0| 7|
----|----|----|----| ... |----|----|----|----|
Ahora viene la solución a tu problema.
Cuando se pasan parámetros a funciones en C (y C++ salvo que utilices referencias) siempre se utiliza el paso por valor, lo que quiere decir que nunca se pasan las variables en si sino copias de estas, así si modificas un parámetro dentro de una función lo que modificas es la copia, no la variable que has utilizado en la llamada. Para poder modificar variables exteriores a una función tienes que utilizar punteros, así dentro de una función siempre sabrás que posición de memoria ocupa una variable exterior y podrás modificarla con el operador asterisco (técnicamente el
operador de indirección).
Así tu código quedaría:
#include <stdio.h>
void funcion1(int *numero1){
(*numero1)=5;
}
int main(){
int numero1=0;
funcion1(&numero1);
return 0;
}
Como puedes ver, en la línea 3 estamos diciendo que la
funcion1 recibe como parámetro un puntero a entero, y en la línea 9 de
main estamos pasando la dirección de memoria de
numero1 a la función.
En la línea 4, dentro de la función, estamos aplicando el operador de indirección al puntero
numero1 para trabajar con la variable que está en la posición de memoria a la que apunta, en este caso la variable
numero1 que está en
main, y le estamos asignando el valor 5.
Espero que te haya quedado claro.
¡Saludos!