Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

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.

Nota: Las direcciones exactas pueden variar cada vez que ejecute el programa.

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.

Consejo: El operador * 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.

Nota: En C++, puntoVar (el puntero) y *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:

Entendiendo los punteros en C++: guía práctica

Lenguaje C

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