Hola, supongo que tu intención es que la función "uno" tome su parámetro y se lo pase a la función "dos". En ese caso, me voy a tomar la libertar de cambiar el nombre del miembro entero de la estructura numero de "n" a "x". Pues tienes un uso duplicado de nombres que si bien no es un error, puede resultar confuso. Así quedaría:
#include<stdio.h>
typedef struct
{
int x;
}numero;
También te aconsejaría que cuando el argumento se refiera a un puntero, uses un sufijo distintivo como "Ptr", o "_ptr". Quedaría entonces:
void uno (numero *n_ptr);
void dos (numero *n_ptr);
Ahora vamos al centro del problema. En C todos los argumentos de las funciones se pasan por valor. Es decir, se pasa como argumento de la función una copia del valor de la variable. Pero se puede simular el paso por referencia, dando como argumento la
dirección de la variable en cuestión (ésto eso, se pasa un puntero a dicha variable). Lo cual permite alterar directamente la variable al manipular en el área de memoria ocupada por ésta. Sólo ten en cuenta que en el código de la función debes usar el operador de indirección "*" para acceder al contenido de la variable, apuntado por la dirección suministrada.
Por ejemplo, supongamos que "uno" pasa el valor de su argumento (un puntero) a "dos", la cual modifica el valor del campo x de la estructura referenciada. Entonces sería
main()
{
numero n;
uno(&n);
}
void uno (numero *n_ptr)
{
dos (n_ptr); // se pasa una copia del puntero a "dos"
}
void dos (numero *n_ptr)
{
(*nptr).x += 1;
}
Observa que en el código de "dos" se accede al contenido apuntado por
n_ptr (el contenido de la variable n) por medio de
(*n_ptr). Se requieren los paréntesis porque el operador "." tiene mayor prioridad que el "*", y de no colocarlos se interpretaría
*(n_ptr.x) que es incorrecto pues
n_ptr es un apuntador y no una estructura.
Por último, aquí puedes ver el código completo y al compilar y ejecutar verás que aunque hemos puesto inicialmente el valor de n.x en 3, al final termina siendo 4
#include<stdio.h>
typedef struct
{
int x;
}numero;
void uno (numero *n_ptr);
void dos (numero *n_ptr);
main()
{
numero n;
n.x = 3;
printf ("antes n.x era: %d\n", n.x);
uno (&n);
printf ("ahora n.x es: %d\n", n.x);
}
void uno (numero *n_ptr)
{
dos (n_ptr); // se pasa una copia del puntero a "dos"
}
void dos (numero *n_ptr)
{
(*n_ptr).x += 1;
}