En este tutorial, aprenderemos sobre punteros en C ++ y su funcionamiento con la ayuda de ejemplos.
En C ++, los punteros son variables que almacenan las direcciones de memoria de otras variables.
Dirección en C ++
Si tenemos una variable var en nuestro programa, & var nos dará su dirección en la memoria. Por ejemplo,
Ejemplo 1: Impresión de direcciones variables en C ++
#include 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; )
Salida
Dirección de var1: 0x7fff5fbff8ac Dirección de var2: 0x7fff5fbff8a8 Dirección de 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 una int
variable es de 4 bytes en un sistema de 64 bits.
Nota: Es posible que no obtenga los mismos resultados al ejecutar 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 pointVar del int
tipo.
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 pointVar y una variable normal p.
Nota: El *
operador se utiliza después del tipo de datos para declarar punteros.
Asignar direcciones a punteros
Así es como podemos asignar direcciones a punteros:
int* pointVar, var; var = 5; // assign address of var to pointVar pointer pointVar = &var;
Aquí, 5
se asigna a la variable var. Y, la dirección de var se asigna al puntero pointVar con el código pointVar = &var
.
Obtenga el valor de la dirección usando punteros
Para obtener el valor señalado 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 pointVar. Hemos utilizado *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 señalado por la dirección almacenada en el puntero. Es decir *pointVar = var
.
Nota: En C ++, pointVar y * pointVar son completamente diferentes. No podemos hacer algo como*pointVar = &var;
Ejemplo 2: Funcionamiento de punteros C ++
#include 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; )
Salida
var = 5 Dirección de var (& var) = 0x61ff08 pointVar = 0x61ff08 Contenido de la dirección apuntada por pointVar (* pointVar) = 5

Cambio de valor señalado por punteros
Si pointVar apunta a la dirección de var, podemos cambiar el valor de var usando * 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í, pointVar y &var
tienen la misma dirección, el valor de var también cambiará cuando se cambie * pointVar.
Ejemplo 3: cambio de valor señalado por punteros
#include 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; )
Salida
var = 5 * pointVar = 5 Cambiando el valor de var a 7: var = 7 * pointVar = 7 Cambiando el valor de * pointVar a 16: var = 16 * pointVar = 16
Errores comunes al trabajar con punteros
Supongamos que queremos que un puntero varPoint apunte a la dirección de var. Entonces,
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?