Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Referencias
Si bien la referencia, es un mecanismo incorporado con el lenguaje C++, es importante introducirlo,
dado que será necesario para introducir los siguientes temas. Una referencia almacena la
dirección de un dato que se encuentra en otra parte de la memoria. Las referencias se deben
inicializar al declararse ya que no es en sí una variable, sino como “una etiqueta” de otra y se
declaran poniendo el operador & después del tipo de dato. A diferencia del puntero, una referencia
inicializada no puede referenciar a un nuevo dato ni ponerla a NULL.
Ejemplo:
/* Ejemplo de referencias */
#include <stdio.h>
int main() {
printf("Con un char\n");
char ch = 'a';
char &char_ref= ch, // Referencia
*char_ptr=&ch; // Puntero
printf("dato= %c, referencia-> %c, puntero-> %c\n", ch, char_ref,
*char_ptr);
char_ref='b';
printf("dato= %c, referencia-> %c, puntero-> %c\n", ch, char_ref,
*char_ptr);
printf("Con un struct\n");
struct stru {
char dato;
} s;
s.dato = 'c';
printf("dato= %c, referencia= %c, puntero-> %c\n", s.dato, stru_ref.dato,
stru_ptr->dato);
stru_ref.dato = 'd';
printf("dato= %c, referencia= %c, puntero-> %c\n", s.dato, stru_ref.dato,
stru_ptr->dato);
}
-76-
UNLaR - APUNTES DE PROGRAMACIÓN
Prof. Ing. Marcelo Daniel Camargo
/********************************************************************/
/* REFEREN.CPP Llamada por referencia, diferencias entre en C y C++ */
/********************************************************************/
#include <STDIO.H>
#include <CONIO.H>
void incdec_en_c(int *x,int *y);
void incdec_en_cpp(int &x,int &y);
int main() {
int a=5,b=9;
printf("Valor inicial a=%d b=%d\n",a,b);
incdec_en_c(&a,&b); /* Invoca funcion por referencia en ANSI C */
printf("incdec_en_c(&a,&b); a=%d b=%d\n",a,b);
incdec_en_cpp(a,b); /* Invoca funcion por referencia en C++ */
printf("incdec_en_cpp(a,b); a=%d b=%d\n",a,b);
return 0;
}
void incdec_en_c(int *x,int *y) { /* Ej. de llamada por ref. en ANSI C*/
(*x)++; /* *x++ no tiene efecto, podria ser *x=*x+1 */
(*y)--;
}
void incdec_en_cpp(int &x,int &y) { /* Ej. de llamada por ref. en C++ */
x++;
y--;
}
La salida:
Valor inicial a=5 b=9
incdec_en_c(&a,&b); a=6 b=8
incdec_en_cpp(a,b); a=7 b=7
Se puede ver en el ej. anterior como se simplifica la declaración e invocación de la función con las
llamadas por referencia del C++.
En incrdecr_en_c los parámetros formales de la función (int *x e int *y) declaran que estos son
dos punteros a enteros. Más adelante, cuando se aborde el tema punteros, se comprenderá más
aún esta declaración.
En la declaración de los parámetros formales de incrdecr_en_cpp el símbolo & está indicando
que x y y son variables referenciadas. Esto significa que los cambios, hechos a ellas dentro del
ámbito de la función, afectarán también al entorno desde el que se hizo la invocación.
En el ejemplo se muestra una función más útil que la anterior, en la que no sería factible su
implementación, sino fuera a través de llamada por referencia. Se trata de la función swap, que
permite intercambiar los valor de dos variables. Se mostrará nuevamente, las implementaciones
para ANSI C y C++.
-77-
UNLaR - APUNTES DE PROGRAMACIÓN
Prof. Ing. Marcelo Daniel Camargo
#include <STDIO.H>
#include <CONIO.H>
void swap_cpp(int &x,int &y);
void swap_c(int *x,int *y);
int main() {
int a=2,b=3;
printf("antes del swap a=%d b=%d\n",a,b);
swap_cpp(a,b); /*swap_C(&a,&b);*/
printf("despues del swap a=%d b=%d\n",a,b);
return 0;
}
void swap_cpp(int &x,int &y) {
int aux=x;
x=y;
y=aux;
}
void swap_c(int *x,int *y) {
int aux=*x;
*x=*y;
*y=aux;
}
La salida:
antes del swap a=2 b=3
despues del swap a=3 b=2
-78-