En el lenguaje de programación C cuando se hace el llamado a una función y se le envían argumentos, dichos argumentos son copiados en los parámetros de la función; lo cual quiere decir que por cada argumento transferido existe una copia almacenada en el parámetro correspondiente. A este esquema de copia de valores se le conoce en el argot computacional como parámetros por valor.
Los parámetros por valor son el esquema estándar de C, es decir, es el que se utiliza normalmente si no se especifica otra cosa; sin embargo, existe otro enfoque para el envío de argumentos y su respectiva recepción como parámetros. En dicho enfoque, no hay una copia de valores sino una referencia a los valores originales, y la forma de implementarlo es a través de apuntadores. Cuando se utiliza dicho esquema se habla de parámetros por referencia.
El Ejemplo 7.2 muestra el uso, funcionamiento, y diferencia de los parámetros por valor y los parámetros por referencia.
La principal diferencia se observa en los prototipos de las funciones. La línea 7 indica que se definirá una función de nombre llamadaValor que no regresará nada y que recibirá un int, es decir, un parámetro por valor.
Los parámetros por valor son el esquema estándar de C, es decir, es el que se utiliza normalmente si no se especifica otra cosa; sin embargo, existe otro enfoque para el envío de argumentos y su respectiva recepción como parámetros. En dicho enfoque, no hay una copia de valores sino una referencia a los valores originales, y la forma de implementarlo es a través de apuntadores. Cuando se utiliza dicho esquema se habla de parámetros por referencia.
El Ejemplo 7.2 muestra el uso, funcionamiento, y diferencia de los parámetros por valor y los parámetros por referencia.
La principal diferencia se observa en los prototipos de las funciones. La línea 7 indica que se definirá una función de nombre llamadaValor que no regresará nada y que recibirá un int, es decir, un parámetro por valor.
Por otro lado, la línea 8 indica que se definirá una función de nombre llamadaReferencia que no regresará nada y que recibirá un apuntador a int, es decir, un parámetro por referencia.
La función main define e inicializa en la línea 11 a la variable entera argumento, misma que será enviada a las funciones llamadaValor y llamadaReferencia en las líneas 14 y 16 respectivamente. Así mismo, se imprime en la salida estándar el valor de argumento en las líneas 13, 15 y 17, para determinar si éste ha sido afectado por los llamados de función correspondientes.
Sólo resta explicar las funciones:
La función main define e inicializa en la línea 11 a la variable entera argumento, misma que será enviada a las funciones llamadaValor y llamadaReferencia en las líneas 14 y 16 respectivamente. Así mismo, se imprime en la salida estándar el valor de argumento en las líneas 13, 15 y 17, para determinar si éste ha sido afectado por los llamados de función correspondientes.
Sólo resta explicar las funciones:
- llamadaValor: recibe en parametro una copia de argumento justo en el llamado de la función (línea 14). La siguiente figura muestra los contextos de las funciones main y llamadaValor separados por una línea y un recuadro, el cual contiene la asignación implícita que ocurre en el llamado de la función.
(a) Representación de argumentos y parámetros en llamada por valor. |
- llamadaReferencia: recibe en parametro la referencia a argumento justo en el llamado de la función (línea 16) (note que en la línea 16 se está enviando la referencia o dirección en memoria de argumento a parametro. La siguiente figura muestra los contextos de las funciones main y llamadaReferencia separados por una línea y un recuadro, el cual contiene la asignación implícita que ocurre en el llamado de la función.
(b) Representación de argumentos y parámetros en llamada por referencia. |
Una posible salida del Ejemplo 7.2 se muestra en la siguiente figura: