Punteros

¿Qué son los punteros?

Un puntero es una variable que almacena la dirección de memoria de un objeto. Los punteros se usan ampliamente en C y C++ para tres propósitos principales: para asignar nuevos objetos en el montón, para pasar funciones a otras funciones.



Operadores

El ampersand (&): este operador nos permite obtener la dirección de memoria de una variable cualquiera y es justo esto (la dirección en memoria) lo que utilizan los punteros para referenciar valores.

El asterisco (*): su utilidad radica en que, si el valor de dicho apuntador corresponde a una dirección de memoria, el asterisco nos permite resolverla y acceder al valor almacenado allí. Dicho de otra manera, un apuntador es únicamente una dirección de memoria (un número) y el asterisco es el que hace la magia de obtener el valor referenciado por dicha dirección.


Declaración de punteros

Nota: es aconsejable iniciar los punteros con NULL.

<tipo> *<identificador>

<tipo>

Tipo de dato del objeto referenciado por el puntero.

<identificador>

Identificador de la variable de tipo puntero.

 

Operaciones con punteros

Dirección

Operador &

&<id> devuelve la dirección de memoria donde comienza la variable <id>.

El operador & se utiliza para asignar valores a datos de tipo puntero:

int i;
int *ptr;
...
ptr = &i;

Indirección

Operador *

* devuelve el contenido del objeto referenciado por el puntero <ptr>.

El operador * se usa para acceder a los objetos a los que apunta un puntero:

char c;
char *ptr;

ptr = &c;
*ptr = ‘A’; // Equivale a escribir: c = ‘A’

 

Asignación

Operador =

A un puntero se le puede asignar una dirección de memoria concreta, la dirección de una variable o el contenido de otro puntero.

Una dirección de memoria concreta:

int *ptr;
...
ptr = 0x1F3CE00A;
...
ptr = NULL;

La dirección de una variable del tipo al que apunta el puntero:

char c;
char *ptr;
...
ptr = &c;

Otro puntero del mismo tipo:
char c;
char *ptr1;
char *ptr2;

ptr1 = &c;
ptr2 = ptr1;

 Ejemplo:

Usualmente al enviar un parámetro a una función todo lo que se haga con dicho parámetro allí adentro no tiene efecto por fuera. Por ejemplo si a una función la se le envía una variable cuyo valor es diez y al interior de la función le sumamos un cinco, después de la ejecución de la función el valor de la variable seguirá siendo diez en vez de quince. Lo que pasó al interior de la función se quedó allí. Para solucionar esto, si queremos que el valor cambie definitivamente, usamos punteros para pasar no el valor del parámetro sino una referencia a éste:

#include "iostream"
#include "stdio.h"
 
using namespace std;
int funcion(int valor)
{
    valor = valor + 10; //Se le suma 10
    return valor;
}
 
int funcionPunteros(int* valor)
{
    *valor = *valor + 10; //Se le suma 10 a la posición en memoria
    return *valor;
}
 
int main()
{
    int numero = 10;
 
    cout << "Antes de funcion " << numero << "\n"; //10
    funcion(numero); //Se pasa por valor
    cout << "Despues de funcion " << numero << "\n"; //10
    cout << "Antes de funcionPunteros " << numero << "\n"; //10
    funcionPunteros(&numero); //Se envía la dirección de memoria y la función resuelve la referencia
 
    cout << "Despues de funcionPunteros " << numero << "\n"; //20 (10+10)
 
    system("pause");
    return 0;
}

Videos explicativos

Punteros

Comentarios

Entradas populares de este blog

Estructura (STRUCT Y TYPEDEF)