Cargando la página...

Tutorial de punteros

Publicado por Gastón el 31/08/2007 en C++ - Nivel Intermedio

Tabla de contenidos

Avatar de
  • ¿Qué es un puntero?
    • Asignaciones de punteros
    • Aritmética de punteros
    • Comparación de punteros
  • Punteros, referencias y punteros a arrays. Utilización en las funciones.
    • Referencias
  • Los Arrays son punteros

La tabla de contenidos pertenece al artículo completo y no al contenido parcial de cada página del mismo si fuese el caso.

Leer los comentarios.

Resúmen

En este artículo se intenta explicar en forma detallada que son, para que sirven y las práticas más comunes del uso de punteros en el lenguaje C++.

Sobre el autor

Avatar de Gastón

Gastón tiene 31 años, vive en Argentina / Santa Fe / Santa Fe y su ocupación es Desarrollador de aplicaciones web.

Forma parte del club desde 19/10/2009 a las 20:52 habiendo estado en linea ayer a las 18:27 por última vez.

Ha publicado 50 artículos en clubdesarrolladores con un promedio de valoración de 7.96 puntos. Puedes visitar su sitio web en http://www.devstudios.com.ar

Estadísticas

  • Leido 61291 veces
  • Valorado 8.24 puntos

Punteros, referencias y punteros a arrays. Utilización en las funciones.



Estos tres conceptos están sumamente ligados entre si, y por ende con dirección de memoria. Ya vimos que un puntero es una variable que contiene la dirección en memoria de otra variable, ahora veremos que uso se le puede dar en las funciones.

Los punteros se utilizan en funciones por varios motivos:
Manipular completamente las variables que se pasan como argumento a la función, permitiendo que los cambios en dichas variables se vean reflejados fuera de ella.

* Recuperar de una función más de un valor.
* Optimizar el procesamiento.
* Retornar referencias

Este ejemplo cumple con los tres primeros motivos mencionados (Referencias se ve en breve).

void intercambiar(int *a, int *b)
{
int aux;
aux = *a;
*a = *b;
*b = aux;
}


La función intercambia dos valores. Para ello solicita dos punteros a enteros, utilizando para acceder a estos valores, el operador de indirección (*).
La llamada a la misma se realiza utilizando el operador de referencia (&).

int a = 1, b = 3;
intercambiar(&a, &b);
//como resultado la funcion intercambia los valores, a = 3 y b = 1


Si lo que queremos es retornar un puntero deberemos definir la función de otra forma, así que démosle además una nueva funcionalidad, retornando el puntero al mayor de los dos números de ésta manera.

int* intercambiar(int *a, int *b)
{
int aux;
aux = *a;
*a = *b;
*b = aux;
return (*a > *b)? a: b;
}


int a = 1, b = 3, *c;
c = intercambiar(&a,&b);
ShowMessage("El mayor es: " + IntToStr(*c)); // que esta en a y en c


Referencias



Las referencias son seudónimos o alias que se aplican a otra entidad del mismo tipo. Para declarar una referencia se coloca & después del tipo de variable y antes del identificador de la misma. Las variables de referencias necesitan inicialización y éste valor (variable o literal) no podrá ser modificado.

int a; // supongamos direccion 0x2740
a = 5; // se asigna el valor 5 a la variable
int& b = a; // creamos la referencia b a la variable a


Tanto a como b están en la misma dirección de memoria, de tal manera que al modificar una de ellas, se modifica la otra. Siguiendo el ejemplo la dirección de b es 0x2740 (la misma que a).

b = 7; // tanto a como b ahora almacenan 7
a = 0; // tanto a como b ahora almacenan 0


Por lo tanto, las referencias, se pueden pensar como punteros a una dirección de memoria fija.

Siguiendo con el ejemplo anterior, pero con referencias:

void intercambiar(int &a, int &b)
{
int aux;
aux = a;
a = b;
b = aux;
}


int a = 1, b = 3;
intercambiar(a, b);
//como resultado la funcion intercambia los valores, a = 3 y b = 1


Tanto el código con punteros como éste ultimo con referencias arrojan el mismo resultado, con la ventaja que el último permite no utilizar el operador de indirección, además en C++ las referencias son muy utilizadas para pasar argumentos a funciones (y como valores de retorno), no sólo para poderlos modificar dentro de la función, sino también por motivos de eficiencia, pues es mucho más rápido pasar un puntero o una referencia de una variable que una copia del valor de esa variable. Si además la variable es una estructura, las ventajas de eficiencia son todavía mucho más notables.
No se debe confundir el uso de (&) en la declaración de una referencia con el operador dirección (&), de la misma forma que no se debe confundir el carácter (*) en la declaración de un puntero, con el operador indirección (*).

El que una función tenga como valor de retorno una variable tipo referencia permite utilizarla de una manera un poco singular. Considérese el siguiente ejemplo:

int& intercambiar(int &a, int &b)
{
int aux;
aux = a;
a = b;
b = aux;
return (a > b)? a: b;
}


Esto permite utilizarla, por ejemplo, del siguiente modo:

int a = 1, b = 3;
intercambiar(a,b) = 0;


Ésta es una forma un poco extraña de utilizar una función: la llamada está a la izquierda del operador de asignación, en vez de aparecer a la derecha en una expresión aritmética o de otro tipo.
El resultado de esta llamada también es un poco extraño: el valor de retorno es una referencia, esto es un alias del argumento de valor máximo. Cuando la llamada a la función se sustituye por su valor de retorno, el resultado de la sentencia anterior es que la variable pasada como argumento que tiene mayor valor se hace igual a cero. Este mismo efecto puede conseguirse mediante punteros, pero con referencias resulta mucho más sencillo.

Si tiene alguna pregunta sobre éste artículo por favor deje un comentario y será respondido.

Descargas

No existen descargas asociadas

Comentarios

Sus comentarios son importantes.

Listado de comentarios

1
03
junio
2008
Avatar de YUBITZA
YUBITZA aportó:
me parece muy bueno el tutorial
2
10
noviembre
2008
Avatar de Jordi Puig
Jordi Puig aportó:
genial! no soy ingeniero ni programador pero esto se entiende perfectamente. Seguid asi!
3
18
julio
2009
Avatar de angel martinez
angel martinez aportó:
gracias de verdad tenia muchos problemas para entender este tema a hora estoy mas claro
4
15
octubre
2009
Avatar de Ca Az
Ca Az aportó:
Excelente tutorial, muy aclaratorio
5
20
octubre
2009
Avatar de willers ers maravilla
Esta muy bueno el tutoroal
6
03
diciembre
2009
Avatar de Uriel Carraro
Uriel Carraro aportó:
Buen tutorial sobre punteros
7
07
enero
2010
Avatar de Javier Gutierrez
Javier Gutierrez aportó:
Gracias, me va a ser de mucha ayuda.
8
28
abril
2010
Avatar de Ezequiel Fernandes
Hola, tengo una duda, el la última parte cuando llama a la función inicializar y le pasa el array que es lo que está pasando?

inicializar(array); //main

void inicializar(int a[5][4][3]) //Acá recibe una copia del array???
{...}

Muy bueno el curso por cierto, me está ayudando mucho a ponerme al día después de 6 años.
9
28
abril
2010
Avatar de Ezequiel Fernandes
O sea la función no sería así:

void inicializar (int *a[]);
10
29
abril
2010
Avatar de Gastón
Gastón [Autor] aportó:
Siempre son punteros :)
11
29
mayo
2010
Avatar de Jhon Cardona
Jhon Cardona aportó:
Excelente tutorial, 10 puntos muchas gracias. Me ha sido muy util!!
12
15
agosto
2010
Avatar de Joshua Villavicencio
Excelente! me ha servido muchisimo.
13
30
abril
2011
Avatar de oscar h
oscar h aportó:
Agradeciendo! de antemano!! me pondre a estudiar!!
14
08
junio
2011
Avatar de jorge alfredo cardenas alatorre
está muy bien el tutorial entendí casi todo solo tengo una duda, no entiendo muy bien que susede en este paso:

return (*a > *b)? a:
b; 
en sí qué me devuelve y porqué?
15
14
octubre
2011
Avatar de Administrador
Administrador aportó:
Evalúa valores, retorna punteros
16
08
noviembre
2011
Avatar de anon tsukumogamiyokai
muy bien chico
17
12
febrero
2012
Avatar de esteban pelado
esteban pelado aportó:
muy ilustrativo, muchas gracias.

Agregar un comentario

Debe estar identificado para agregar un comentario