Cómo pasar punteros a funciones en C ++

Uno de los usos de las variables de puntero en C ++ es en el paso de argumentos de funciones. Para entender por qué esto es importante, es necesario entender cómo se pasan argumentos a una función.

Pasando por el valor en C ++

De forma predeterminada, los argumentos se pasan a las funciones por valor. Esto tiene el resultado algo sorprendente que al cambiar el valor de una variable en una función normalmente no cambia su valor en la función de llamada. Considere el siguiente segmento de código de ejemplo:

fn void (int nArg) {nArg = 10 - // valor de nArg en este punto es 10} void padre (void) {n1 = 0-fn (n1) int - // valor de n1 en este punto sigue siendo 0}

Aquí el parent () función inicializa la variable entera n1 a 0. El valor de n1 a continuación, se pasa a fn (). Al entrar en la función, nArg es igual a 0, el valor pasó. fn () cambia el valor de nArg a 10 antes de volver a parent (). A su regreso a parent (), El valor de n1 todavía es 0.

La razón de este comportamiento es que C ++ no pasa una variable a una función. En lugar de ello, C ++ pasa el valor contenido en la variable en el momento de la llamada. Es decir, se evalúa la expresión, incluso si es sólo un nombre de variable, y se pasa el resultado.

En el ejemplo, el valor de n1, que es 0, se pasó a fn (). Lo que hace la función con ese valor no tiene efecto en n1.

Pasando valores de puntero en C ++

Al igual que cualquier otro tipo intrínseco, un puntero puede ser pasado como argumento a una función:

void fn (int * pnArg) {* pnArg = 10} void padre (void) {int n = 0-fn (n) - // esto pasa la dirección de i // Ahora el valor de n es 10}

En este caso, la dirección de n se pasa a la función de fn () en lugar del valor de n. La importancia de esta diferencia es evidente si tenemos en cuenta la asignación dentro fn ().

Suponer n se encuentra en la dirección 0x100. Más que el valor 10, la llamada fn (n) pasa el valor 0x100. Dentro fn (), la asignación *pnArg = 10 almacena el valor 10 en el int variable ubicada en el lugar 0x100, remplazando así el valor 0. A su regreso a parent (), El valor de n es 10 porque n es sólo otro nombre para 0x100.

Al pasar por referencia en C ++

C ++ proporciona una forma rápida para pasar argumentos por dirección - un atajo que le permite evitar tener que molestar con punteros. La siguiente declaración crea una variable n1 y una segunda referencia a la misma n1 pero con un nuevo nombre, nRef:

int n1 - // declara un int variableint nRef = n1 - // declarar una segunda referencia a n1nRef = 1- // ahora el acceso a la referencia // tiene el mismo efecto que con el acceso n1 - // n1 es ahora igual a 1

Una variable de referencia como nRef debe ser inicializado cuando se declara, porque cada vez subsiguiente que se utiliza su nombre, C ++ asumirá que te refieres a la variable que nRef se refiere a.

Las variables de referencia encuentran su aplicación principal en llamadas de función:

fn void (int rnArg) // declarar argumento de referencia {rnArg = 10 - // cambiar el valor de la variable ...} //...that rnArg refiere padres tovoid (void) {int n 1 = 0-fn (n1) - // pasar una referencia a // n1 aquí el valor de n1 es 10}

Se llama pasando por referencia. La declaración int rnArg declara rnArg a ser una referencia a un argumento entero. los fn () función almacena el valor 10 en el int posición referenciada por rnArg.

Pasando por referencia es la misma que pasar la dirección de una variable. La sintaxis de referencia pone la responsabilidad en C ++ para aplicar el " dirección de " operador a la referencia en lugar de requerir que el programador para hacerlo.

No se puede sobrecargar un pase por la función de valor con su pase por el equivalente de referencia. Por lo tanto, no se podía definir las dos funciones fn (int) y fn (int) en el mismo programa. C ++ no sabría cuál para llamar.




» » » » Cómo pasar punteros a funciones en C ++