C++ Consejos con ejemplos
ยฟQuรฉ son los punteros?
In C++, un puntero se refiere a una variable que contiene la direcciรณn de otra variable. Al igual que las variables normales, los punteros tienen un tipo de datos. Por ejemplo, un puntero de tipo entero puede contener la direcciรณn de una variable de tipo entero. Un puntero de tipo carรกcter puede contener la direcciรณn de una variable de tipo carรกcter.
Deberรญa ver un puntero como una representaciรณn simbรณlica de una direcciรณn de memoria. Con punteros, los programas pueden simular una llamada por referencia. Tambiรฉn pueden crear y manipular estructuras de datos dinรกmicas. En C++, una variable de puntero se refiere a una variable que apunta a una direcciรณn especรญfica en una memoria apuntada por otra variable.
Direcciones en C++
Comprender C++ Para algunos consejos, debe comprender cรณmo las computadoras almacenan datos.
Cuando creas una variable en tu C++ programa, se le asigna algo de espacio en la memoria de la computadora. El valor de esta variable se almacena en la ubicaciรณn asignada.
Para conocer la ubicaciรณn en la memoria de la computadora donde se almacenan los datos, C++ proporciona & Operador (de referencia). El operador devuelve la direcciรณn que ocupa una variable.
Por ejemplo, si x es una variable, &x devuelve la direcciรณn de la variable.
Sintaxis de declaraciรณn de puntero
La declaracion de C++ toma la siguiente sintaxis:
datatype *variable_name;
- El tipo de datos es el tipo base del puntero que debe ser vรกlido. C++ tipo de datos
- El nombre_variable debe ser el nombre de la variable puntero.
- El asterisco utilizado anteriormente para la declaraciรณn de punteros es similar al utilizado para realizar la operaciรณn de multiplicaciรณn. Es el asterisco el que marca la variable como puntero.
A continuaciรณn se muestra un ejemplo de declaraciones de puntero vรกlidas en C++:
int *x; // a pointer to integer double *x; // a pointer to double float *x; // a pointer to float char *ch // a pointer to a character
Operador de referencia (&) y operador de deferencia (*)
El operador de referencia (&) devuelve la direcciรณn de la variable.
El operador de desreferencia (*) nos ayuda a obtener el valor que se ha almacenado en una direcciรณn de memoria.
Por ejemplo:
Si tenemos una variable con el nombre num, almacenada en la direcciรณn 0x234 y almacenando el valor 28.
El operador de referencia (&) devolverรก 0x234.
El operador de desreferencia (*) devolverรก 5.
Ejemplo 1:
#include <iostream>
using namespace std;
int main() {
int x = 27;
int *ip;
ip = &x;
cout << "Value of x is : ";
cout << x << endl;
cout << "Value of ip is : ";
cout << ip<< endl;
cout << "Value of *ip is : ";
cout << *ip << endl;
return 0;
}
Salida:
Cรณmo funciona esto:
Aquรญ hay una captura de pantalla del cรณdigo:
Code Explicaciรณn:
- Importe el archivo de encabezado iostream. Esto nos permitirรก utilizar las funciones definidas en el archivo de encabezado sin obtener errores.
- Incluya el espacio de nombres estรกndar para usar sus clases sin llamarlo.
- Llame a la funciรณn principal(). La lรณgica del programa debe agregarse dentro del cuerpo de esta funciรณn. El { marca el comienzo del cuerpo de la funciรณn.
- Declare una variable entera x y asรญgnele un valor de 27.
- Declare una variable de puntero *ip.
- Almacene la direcciรณn de la variable x en la variable de puntero.
- Imprime algo de texto en la consola.
- Imprime el valor de la variable x en la pantalla.
- Imprime algo de texto en la consola.
- Imprime la direcciรณn de la variable x. El valor de la direcciรณn se almacenรณ en la variable ip.
- Imprime algo de texto en la consola.
- Imprime el valor almacenado en la direcciรณn del puntero.
- El programa deberรญa devolver valor tras una ejecuciรณn exitosa.
- Fin del cuerpo de la funciรณn main().
Punteros y matrices
Las matrices y los punteros funcionan segรบn un concepto relacionado. Hay diferentes cosas a tener en cuenta cuando se trabaja con matrices que tienen punteros. El nombre de la matriz en sรญ indica la direcciรณn base de la matriz. Esto significa que para asignar la direcciรณn de una matriz a un puntero, no debe utilizar un signo comercial (&).
Por ejemplo:
p = arr;
Lo anterior es correcto ya que arr representa la direcciรณn de las matrices. Aquรญ hay otro ejemplo:
p = &arr;
Lo anterior es incorrecto.
Podemos convertir implรญcitamente una matriz en un puntero. Por ejemplo:
int arr [20]; int * ip;
A continuaciรณn se muestra una operaciรณn vรกlida:
ip = arr;
Despuรฉs de la declaraciรณn anterior, ip y arr serรกn equivalentes y compartirรกn propiedades. Sin embargo, se puede asignar una direcciรณn diferente a ip, pero no podemos asignar nada a arr.
Ejemplo 2:
Este ejemplo muestra cรณmo recorrer una matriz usando punteros:
#include <iostream>
using namespace std;
int main() {
int *ip;
int arr[] = { 10, 34, 13, 76, 5, 46 };
ip = arr;
for (int x = 0; x < 6; x++) {
cout << *ip << endl;
ip++;
}
return 0;
}
Salida:
Aquรญ hay una captura de pantalla del cรณdigo:
Code Explicaciรณn:
- Declare una variable de puntero entero ip.
- Declare una matriz llamada arr y almacene 6 nรบmeros enteros en ella.
- Asigne arr a ip. La ip y arr serรกn equivalentes.
- Crea un bucle for. La variable de bucle x se creรณ para iterar sobre los elementos de la matriz del รญndice 0 al 5.
- Imprime los valores almacenados en la direcciรณn del puntero IP. Se devolverรก un valor por iteraciรณn y se realizarรกn un total de 6 repeticiones. El final es un C++ palabra clave que significa la lรญnea final. Esta acciรณn le permite mover el cursor a la siguiente lรญnea despuรฉs de imprimir cada valor. Cada valor se imprimirรก en una lรญnea individual.
- Para mover el puntero a la siguiente posiciรณn int despuรฉs de cada iteraciรณn.
- Fin del bucle for.
- El programa debe devolver algo tras una ejecuciรณn exitosa.
- Fin del cuerpo de la funciรณn main().
Puntero nulo
Si no hay una direcciรณn exacta que asignar, entonces a la variable de puntero se le puede asignar un NULL. Debe hacerse durante la declaraciรณn. Este tipo de puntero se conoce como puntero nulo. Su valor es cero y estรก definido en muchas bibliotecas estรกndar como iostream.
Ejemplo 3:
#include <iostream>
using namespace std;
int main() {
int *ip = NULL;
cout << "Value of ip is: " << ip;
return 0;
}
Salida:
Aquรญ hay una captura de pantalla del cรณdigo:
Code Explicaciรณn:
- Declare una variable de puntero ip y asรญgnele un valor NULL.
- Imprima el valor de la variable del puntero ip junto con algรบn texto en la consola.
- El programa debe devolver valor una vez completado con รฉxito.
- Fin del cuerpo de la funciรณn main().
Punteros de variables
Con C++, puede manipular datos directamente desde la memoria de la computadora.
El espacio de memoria se puede asignar o reasignar segรบn se desee. Esto es posible gracias a las variables de puntero.
Las variables de puntero apuntan a una direcciรณn especรญfica en la memoria de la computadora a la que apunta otra variable.
Se puede declarar de la siguiente manera:
int *p;
O bien,
int* p;
En su ejemplo, hemos declarado la variable de puntero p.
Contendrรก una direcciรณn de memoria.
El asterisco es el operador de desreferencia que significa un puntero a.
El puntero p apunta a un valor entero en la direcciรณn de memoria.
Ejemplo 4:
#include <iostream>
using namespace std;
int main() {
int *p, x = 30;
p = &x;
cout << "Value of x is: " << *p;
return 0;
}
Salida:
Aquรญ hay una captura de pantalla del cรณdigo:
Code Explicaciรณn:
- Declare una variable de puntero p y una variable x con un valor de 30.
- Asigne la direcciรณn de la variable x a p.
- Imprima el valor de la variable de puntero p junto con algรบn texto en la consola.
- El programa debe devolver valor una vez completado con รฉxito.
- Fin del cuerpo de la funciรณn main().
Aplicaciรณn de consejos
Funciones en C++ Puede devolver solo un valor. Ademรกs, todas las variables declaradas en una funciรณn se asignan en la pila de llamadas de la funciรณn. Tan pronto como la funciรณn retorna, se destruyen todas las variables de la pila.
Los argumentos de una funciรณn se pasan por valor y cualquier modificaciรณn que se haga en las variables no cambia el valor de las variables reales que se pasan. El siguiente ejemplo ayuda a ilustrar este concepto:
Ejemplo 5:
#include <iostream>
using namespace std;
void test(int*, int*);
int main() {
int a = 5, b = 5;
cout << "Before changing:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
test(&a, &b);
cout << "\nAfter changing" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
void test(int* n1, int* n2) {
*n1 = 10;
*n2 = 11;
}
Salida:
Aquรญ hay una captura de pantalla del cรณdigo:
Code Explicaciรณn:
- Cree un prototipo de una funciรณn llamada prueba que tomarรก dos parรกmetros enteros.
- Llame a la funciรณn principal(). Agregaremos la lรณgica del programa dentro de su cuerpo.
- Declare dos variables enteras a y b, cada una con un valor de 5.
- Imprime algo de texto en la consola. El endl (lรญnea final) moverรก el cursor para comenzar a imprimir en la siguiente lรญnea.
- Imprima el valor de la variable a en la consola junto con otro texto. El endl (lรญnea final) moverรก el cursor para comenzar a imprimir en la siguiente lรญnea.
- Imprima el valor de la variable b en la consola junto con otro texto. El endl (lรญnea final) moverรก el cursor para comenzar a imprimir en la siguiente lรญnea.
- Cree una funciรณn llamada test() que tome las direcciones de las variables a y b como parรกmetros.
- Imprime algo de texto en la consola. El \n crearรก una nueva lรญnea en blanco antes de imprimir el texto. endl (lรญnea final) moverรก el cursor para comenzar a imprimir en la siguiente lรญnea despuรฉs de imprimir el texto.
- Imprima el valor de la variable a en la consola junto con otro texto. El endl (lรญnea final) moverรก el cursor para comenzar a imprimir en la siguiente lรญnea.
- Imprima el valor de la variable b en la consola junto con otro texto. El endl (lรญnea final) moverรก el cursor para comenzar a imprimir en la siguiente lรญnea.
- El programa debe devolver valor una vez completado con รฉxito.
- Fin del cuerpo de la funciรณn main().
- Definiendo la funciรณn test(). La funciรณn debe tomar dos variables de puntero entero *n1 y *n2.
- Asignar a la variable de puntero *n1 un valor de 10.
- Asignar a la variable de puntero *n2 un valor de 11.
- Fin del cuerpo de la funciรณn test().
Aunque se asignan nuevos valores a las variables a y b dentro de la funciรณn test, una vez que se completa la llamada a la funciรณn, lo mismo no se refleja en la funciรณn externa principal.
El uso de punteros como argumentos de funciรณn ayuda a pasar la direcciรณn real de la variable en la funciรณn, y todos los cambios realizados en la variable se reflejarรกn en la funciรณn externa.
En el caso anterior, la funciรณn 'prueba' tiene la direcciรณn de las variables 'a' y 'b'. Estas dos variables son directamente accesibles desde la funciรณn 'prueba' y, por lo tanto, cualquier cambio realizado en estas variables se refleja en la funciรณn que llama. 'principal.'
Ventajas de usar punteros
Aquรญ se detallan las ventajas y ventajas de utilizar punteros.
- Los punteros son variables que almacenan la direcciรณn de otros variables en C++.
- La funciรณn puede modificar y devolver mรกs de una variable mediante punteros.
- La memoria se puede asignar y desasignar dinรกmicamente mediante punteros.
- Los punteros ayudan a simplificar la complejidad del programa.
- La velocidad de ejecuciรณn de un programa mejora mediante el uso de punteros.
Resumen
- Un puntero se refiere a una variable que contiene la direcciรณn de otra variable.
- Cada puntero tiene un tipo de datos vรกlido.
- Un puntero es una representaciรณn simbรณlica de una direcciรณn de memoria.
- Los punteros permiten a los programas simular llamadas por referencia y crear y manipular estructuras de datos dinรกmicas.
- Matrices y los punteros utilizan un concepto relacionado.
- El nombre de la matriz indica la base de la matriz.
- Si desea asignar la direcciรณn de una matriz a un puntero, no utilice un signo comercial (&).
- Si no hay una direcciรณn especรญfica para asignar una variable de puntero, asรญgnele un NULL.







