Entendiendo los punteros en C++: guía práctica
Punteros en C++
Este tutorial explica los punteros en C++, su funcionamiento y ejemplos prácticos para ayudarle a dominar esta característica esencial del lenguaje.
En C++, un puntero es una variable que almacena la dirección de memoria de otra variable. Los punteros permiten la manipulación directa de memoria, asignación dinámica y manejo eficiente de datos.
Direcciones en C++
Dada una variable var, la expresión &var devuelve su dirección en memoria. Por ejemplo:
Ejemplo 1: Imprimir direcciones de variables en C++
#include <iostream>
using namespace std;
int main() {
// declarar variables
int var1 = 3;
int var2 = 24;
int var3 = 17;
// imprimir dirección de var1
cout << "Dirección de var1: " << &var1 << endl;
// imprimir dirección de var2
cout << "Dirección de var2: " << &var2 << endl;
// imprimir dirección de var3
cout << "Dirección de var3: " << &var3 << endl;
}
Salida
Dirección de var1: 0x7fff5fbff8ac Dirección de var2: 0x7fff5fbff8a8 Dirección de var3: 0x7fff5fbff8a4
Las direcciones se muestran en formato hexadecimal. La diferencia de 4 bytes entre direcciones consecutivas refleja el tamaño de 4 bytes de un int en un sistema de 64 bits.
Punteros en C++
Como se muestra, los punteros almacenan direcciones en lugar de valores directos. Declarar un puntero es sencillo:
int *puntoVar;
Aquí, puntoVar es un puntero a un int. La sintaxis preferida coloca el asterisco junto al tipo:
int* puntoVar; // sintaxis preferida
También son posibles declaraciones múltiples:
int* puntoVar, p;
En esta línea, puntoVar es un puntero, mientras que p es un int normal. El asterisco se asocia con el nombre de la variable, no con el tipo.
* se usa para declarar punteros, no para realizar multiplicaciones.Asignar direcciones a punteros
Para vincular un puntero a la dirección de una variable, use el operador de dirección &:
int* puntoVar, var;
var = 5;
// asignar dirección de var al puntero puntoVar
puntoVar = &var;
Ahora puntoVar contiene la dirección de memoria de var.
Obtener el valor desde la dirección usando punteros
El operador de desreferencia * recupera el valor almacenado en la dirección que contiene un puntero:
int* puntoVar, var;
var = 5;
puntoVar = &var;
cout << *puntoVar << endl; // Salida: 5
Aquí, *puntoVar produce el valor de var (5). El operador se llama operador de desreferencia.
*puntoVar (el valor al que apunta) son entidades distintas.Ejemplo 2: Funcionamiento de punteros en C++
#include <iostream>
using namespace std;
int main() {
int var = 5;
// declarar variable puntero
int* puntoVar;
// almacenar dirección de var
puntoVar = &var;
// imprimir valor de var
cout << "var = " << var << endl;
// imprimir dirección de var
cout << "Dirección de var (&var) = " << &var << endl << endl;
// imprimir puntero puntoVar
cout << "puntoVar = " << puntoVar << endl;
// imprimir contenido de la dirección a la que apunta puntoVar
cout << "Contenido de la dirección apuntada por puntoVar (*puntoVar) = " << *puntoVar << endl;
return 0;
}
Salida
var = 5 Dirección de var (&var) = 0x61ff08 puntoVar = 0x61ff08 Contenido de la dirección apuntada por puntoVar (*puntoVar) = 5
Cambiar el valor apuntado por punteros
Si puntoVar apunta a var, modificar *puntoVar cambia la variable original:
int var = 5;
int* puntoVar;
puntoVar = &var;
*puntoVar = 1;
cout << var << endl; // Salida: 1
Tanto puntoVar como &var contienen la misma dirección; alterar el valor desreferenciado actualiza var.
Ejemplo 3: Cambiar valor apuntado por punteros
#include <iostream>
using namespace std;
int main() {
int var = 5;
int* puntoVar;
// almacenar dirección de var
puntoVar = &var;
// imprimir var
cout << "var = " << var << endl;
// imprimir *puntoVar
cout << "*puntoVar = " << *puntoVar << endl << endl;
cout << "Cambiando valor de var a 7:" << endl;
// cambiar valor de var a 7
var = 7;
// imprimir var
cout << "var = " << var << endl;
// imprimir *puntoVar
cout << "*puntoVar = " << *puntoVar << endl << endl;
cout << "Cambiando valor de *puntoVar a 16:" << endl;
// cambiar valor de var a 16
*puntoVar = 16;
// imprimir var
cout << "var = " << var << endl;
// imprimir *puntoVar
cout << "*puntoVar = " << *puntoVar << endl;
return 0;
}
Salida
var = 5 *puntoVar = 5 Cambiando valor de var a 7: var = 7 *puntoVar = 7 Cambiando valor de *puntoVar a 16: var = 16 *puntoVar = 16
Errores comunes al trabajar con punteros
A continuación se muestran errores típicos y la forma correcta de manejar punteros:
int var, *varPunto;
// ¡Incorrecto! varPunto es una dirección pero var no lo es
varPunto = var;
// ¡Incorrecto!
// &var es una dirección
// *varPunto es el valor almacenado en &var
*varPunto = &var;
// ¡Correcto!
// varPunto es una dirección y &var también
varPunto = &var;
// ¡Correcto!
// tanto *varPunto como var son valores
*varPunto = var;
Lecturas recomendadas:
- Cómo usar punteros de tipo genérico usando punteros void
- Cómo representar un array usando un puntero
- Cómo usar punteros con funciones
- Cómo usar punteros con estructuras

Lenguaje C
- Entendiendo los Tipos de Datos en C++: Fundamentos, Modificadores y Mejores Prácticas
- Dominando los Operadores en C++: Guía Completa con Ejemplos Prácticos
- Comentarios en C++: Mejores Prácticas para Código Legible y Mantenible
- Dominando las plantillas de clase en C++: guía práctica
- Dominando punteros en C: Tutorial práctico guiado por expertos
- Dominando punteros en C++: Conceptos, ejemplos y aplicaciones prácticas
- Dominando punteros en C: Pasos prácticos para programación avanzada
- Lenguaje de Programación C++: Visión General y Características Clave
- Constantes y Literales en C++: Tipos, Sintaxis y Mejores Prácticas
- Guía Completa de Operadores en C++: Tipos, Uso y Mejores Prácticas
- Dominando los Tipos Numéricos en C++: Guía Práctica