¿Cuál es la diferencia esencial entre transferencia de valor y transferencia de dirección? ¿Cómo cambian los valores de los parámetros formales y los parámetros reales?
Ya sea un valor numérico o un puntero, los datos se obtienen y luego se colocan en la pila. La diferencia radica en el tipo de datos. El compilador sabe qué tipo de datos se utiliza correctamente en la función. a menos que haya un error en el código fuente, se informará un error durante la precompilación.
Cuando presionas la pila, en realidad estás copiando el valor del programa externo al espacio de la pila. Desde la perspectiva del código fuente, esto se convierte en un parámetro formal, mientras que las variables utilizadas para pasar parámetros en el programa externo se denominan parámetros reales.
Por ejemplo
int a=10;
int b;
int *p =&b;
Función
fun(int a1,int *p1);
Llamar
fun(a,p);
Al llamar divertido .
Primero obtenga el valor de p. Dado que p ha sido asignado a la dirección de a, el valor de p, que es la dirección de a, se coloca en la pila.
Luego obtén el valor de a, que es el número entero 10, y empújalo en la pila.
Al ejecutar la instrucción de ensamblaje CALL, los datos se eliminan haciendo estallar la pila. El orden es eliminar el valor de a primero, luego eliminar el valor de p (primero en entrar, primero en salir); En este momento, el nombre correspondiente al valor de a es a1 y el nombre correspondiente al valor de p es p1, que en realidad determina la dirección del parámetro en el nivel de ensamblaje, de modo que se puede acceder al código dentro de la función.
Después de determinar (obtener) los datos, ingresa el cuerpo de la función y, como la función ya está definida, el compilador sabe que a1 es un número entero y p1 es una dirección. Siempre que el código fuente sea correcto, determinará diferentes operaciones según diferentes tipos, incluso si todas parecen datos de 4 bytes.
Si el código dentro de la función es el siguiente
*p1=a1;
El compilador organizará las siguientes operaciones (la dirección del parámetro ha sido determinado):
Obtener el valor del parámetro a1
Obtener el valor del parámetro p1
Escribir el valor de a1 en el espacio de memoria señalado por el valor de p1 (el valor de p1 es una dirección).
Por lo tanto, ya sea una variable de valor o una variable de puntero, se pasa una copia. Cambiar el valor del parámetro formal en la función en sí no afectará el valor del parámetro real. El problema es que al pasar una variable puntero, la operación es indirecta, afectando así a la referencia real.