Funcionamiento de los punteros de C++

Puntero de C++

En C++, los punteros son variables que almacenan las direcciones de memoria de otras variables.

Dirección en C++

Si tenemos una variable variable en nuestro programa, &var nos dará su dirección en la memoria. Por ejemplo,

Ejemplo 1: Impresión de direcciones variables en C++

#include <iostream>
using namespace std;

int main()
{
    // declare variables
    int var1 = 3;
    int var2 = 24;
    int var3 = 17;

    // print address of var1
    cout << "Address of var1: "<< &var1 << endl;

    // print address of var2
    cout << "Address of var2: " << &var2 << endl;

    // print address of var3
    cout << "Address of var3: " << &var3 << endl;
}

Producción

Address of var1: 0x7fff5fbff8ac
Address of var2: 0x7fff5fbff8a8
Address of var3: 0x7fff5fbff8a4

Aquí, 0x al principio representa que la dirección está en forma hexadecimal.

Observe que la primera dirección difiere de la segunda en 4 bytes y la segunda dirección difiere de la tercera en 4 bytes.

Esto se debe a que el tamaño de un int variable es de 4 bytes en un sistema de 64 bits.

Nota: Es posible que no obtenga los mismos resultados cuando ejecute el programa.


Punteros de C++

Como se mencionó anteriormente, los punteros se utilizan para almacenar direcciones en lugar de valores.

Así es como podemos declarar punteros.

int *pointVar;

Aquí, hemos declarado un puntero VarPunto del int escribe.

También podemos declarar punteros de la siguiente manera.

int* pointVar; // preferred syntax

Tomemos otro ejemplo de declaración de punteros.

int* pointVar, p;

Aquí, hemos declarado un puntero VarPunto y una variable normal pags.

Nota: los * El operador se usa después del tipo de datos para declarar punteros.


Asignación de direcciones a punteros

Así es como podemos asignar direcciones a los punteros:

int* pointVar, var;
var = 5;

// assign address of var to pointVar pointer
pointVar = &var;

Aquí, 5 se asigna a la variable variable. Y, la dirección de variable se asigna a la VarPunto puntero con el código pointVar = &var.


Obtenga el valor de la dirección usando punteros

Para obtener el valor apuntado por un puntero, usamos el * operador. Por ejemplo:

int* pointVar, var;
var = 5;

// assign address of var to pointVar
pointVar = &var;

// access value pointed by pointVar
cout << *pointVar << endl;   // Output: 5

En el código anterior, la dirección de var se asigna a VarPunto. hemos usado el *pointVar para obtener el valor almacenado en esa dirección.

Cuando * se usa con punteros, se llama operador de desreferencia. Opera sobre un puntero y da el valor apuntado por la dirección almacenada en el puntero. Eso es, *pointVar = var.

Nota: en C++, VarPunto y *pointVar es completamente diferente No podemos hacer algo como *pointVar = &var;


Ejemplo 2: funcionamiento de los punteros de C++

#include <iostream>
using namespace std;
int main() {
    int var = 5;

    // declare pointer variable
    int* pointVar;

    // store address of var
    pointVar = &var;

    // print value of var
    cout << "var = " << var << endl;

    // print address of var
    cout << "Address of var (&var) = " << &var << endl
         << endl;

    // print pointer pointVar
    cout << "pointVar = " << pointVar << endl;

    // print the content of the address pointVar points to
    cout << "Content of the address pointed to by pointVar (*pointVar) = " << *pointVar << endl;
    
    return 0;
}

Producción

var = 5
Address of var (&var) = 0x61ff08

pointVar = 0x61ff08
Content of the address pointed to by pointVar (*pointVar) = 5
Funcionamiento de los punteros de C++

Cambio de valor señalado por punteros

Si VarPunto apunta a la dirección de variablepodemos cambiar el valor de variable mediante el uso *pointVar.

Por ejemplo,

int var = 5;
int* pointVar;

// assign address of var
pointVar = &var;

// change value at address pointVar
*pointVar = 1;

cout << var << endl; // Output: 1

Aquí, VarPunto y &var tienen la misma dirección, el valor de variable también se cambiará cuando *pointVar está cambiado.


Ejemplo 3: Cambio de valor apuntado por punteros

#include <iostream>
using namespace std;
int main() {
    int var = 5;
    int* pointVar;

    // store address of var
    pointVar = &var;

    // print var
    cout << "var = " << var << endl;

    // print *pointVar
    cout << "*pointVar = " << *pointVar << endl
         << endl;

    cout << "Changing value of var to 7:" << endl;

    // change value of var to 7
    var = 7;

    // print var
    cout << "var = " << var << endl;

    // print *pointVar
    cout << "*pointVar = " << *pointVar << endl
         << endl;

    cout << "Changing value of *pointVar to 16:" << endl;

    // change value of var to 16
    *pointVar = 16;

    // print var
    cout << "var = " << var << endl;

    // print *pointVar
    cout << "*pointVar = " << *pointVar << endl;
    return 0;
}

Producción

var = 5
*pointVar = 5

Changing value of var to 7:
var = 7
*pointVar = 7

Changing value of *pointVar to 16:
var = 16
*pointVar = 16

Errores comunes al trabajar con punteros

Supongamos que queremos un puntero puntovar señalar la dirección de variable. Después,

int var, *varPoint;

// Wrong! 
// varPoint is an address but var is not
varPoint = var;

// Wrong!
// &var is an address
// *varPoint is the value stored in &var
*varPoint = &var;

// Correct! 
// varPoint is an address and so is &var
varPoint = &var;

 // Correct!
// both *varPoint and var are values
*varPoint = var;

Lecturas recomendadas:

  • ¿Cómo usar punteros de tipo de datos genéricos usando un puntero vacío?
  • ¿Cómo representar una matriz usando un puntero?
  • ¿Cómo usar punteros con funciones?
  • ¿Cómo usar punteros con estructuras?

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *