Parámetros por valor y por referencia

1. Paso de parámetros por valor.
Pasar parámetros por valor significa que a la función se le pasa una copia del valor que contiene el parámetro actual. 
Los valores de los parámetros de la llamada se copian en los parámetros de la cabecera de la función. La función trabaja con una copia de los valores por lo que cualquier modificación en estos valores no afecta al valor de las variables utilizadas en la llamada. 
Aunque los parámetros actuales (los que aparecen en la llamada a la función) y los parámetros formales (los que aparecen en la cabecera de la función) tengan el mismo nombre son variables distintas que ocupan posiciones distintas de memoria.
Por defecto, todos los argumentos salvo los arrays se pasan por valor. 
Ejemplo de paso de parámetros por valor
El siguiente programa lee un número entero y llama a una función que invierte las cifras del número:



#include <iostream>
using namespace std;
int invertir (int);
int main()
{   int num; 
    int resultado; 
    cout << "Introduce un numero entero: ";
    cin >> num;
    resultado = invertir(num);
    cout << "Numero introducido: " << num << endl;
    cout << "Numero con las cifras invertidas: " << resultado << endl;
    system("pause");
}
int invertir(int num)
{
    int inverso = 0, cifra;
    while (num != 0)
    {
        cifra = num % 10; 
        inverso = inverso * 10 + cifra;
        num = num / 10;
    }
    return inverso;
}


2. Paso de parámetros por referencia.
El paso de parámetros por referencia permite que la función pueda modificar el valor del parámetro recibido.
Vamos a explicar dos formas de pasar los parámetros por referencia:
2.1 Paso de parámetros por referencia basado en punteros al estilo C.
2.2 Paso de parámetros por referencia usando referencias al estilo C++.
2.1 Paso de parámetros por referencia utilizando punteros.
Cuando se pasan parámetros por referencia, se le envía a la función la dirección de memoria del parámetro actual y no su valorLa función realmente está trabajando con el dato original y cualquier modificación del valor que se realice dentro de la función se estará realizando con el parámetro actual.
Para recibir la dirección del parámetro actual, el parámetro formal debe ser un puntero.
Ejemplos de paso de parámetros por referencia
Ejemplo 1:
Programa c++ que lee dos números por teclado y los envía a una función para que intercambie sus valores.

#include <iostream>
using namespace std;
void intercambio(int *, int *); 
int main( )
{
    int a, b;
    cout << "Introduce primer numero: ";
    cin >> a;
    cout << "Introduce segundo numero: ";
    cin >> b;
    cout << endl;
    cout << "valor de a: " << a << " valor de b: " << b << endl;
    intercambio(&a, &b);  
    cout << endl << "Despues del intercambio: " << endl << endl; 
    cout << "valor de a: " << a << " valor de b: " << b << endl;
    system("pause");
}
void intercambio(int *x, int *y)
{
    int z;                       
    z = *x;
    *x = *y;
    *y = z;
}

EJEMPLO 2.1
// Hora un segundo después
#include <iostream>
#include <iomanip>
using namespace std;
void segundo_despues(int *, int *, int *);
int main()
{   int horas, minutos, segundos;
    do
    {
        cout << "Introduce hora: ";
        cin >> horas;
    }while(horas<0 || horas > 23);
    do
    {
        cout << "Introduce minutos: ";
        cin >> minutos;
    }while(minutos<0 || minutos > 59);
    do
    {
        cout << "Introduce segundos: ";
        cin >> segundos;
    }while(segundos<0 || segundos > 59);

    //llamada a la función
    segundo_despues(&horas, &minutos, &segundos);

    cout << setfill('0');
    cout << endl << "Hora un segundo despues: ";
    cout << setw(2) << horas << ":";
    cout << setw(2) << minutos << ":";
    cout << setw(2) << segundos << endl;
    system("pause");
}

//function c++ que recibe una hora expresada en 
//horas, minutos y segundos y calcula la hora
//un segundo después
void segundo_despues(int *h, int *m, int *s)
{
     (*s)++;
     if(*s == 60)
     {
            *s = 0;
            (*m)++;
            if(*m == 60)
                {
                    *m = 0;
                    (*h)++;
                    if(*h == 24)
                        {
                            *h = 0;
                        }
                }
    }
}

Comentarios

Entradas populares de este blog

Instruccion Switch

Proyecto calculadora basica