¿Qué son los punteros?
En C ++, un puntero se refiere a una variable que contiene la dirección de otra variable. Como las variables regulares, los punteros tienen un tipo de datos. Por ejemplo, un puntero de tipo integer puede contener la dirección de una variable de tipo integer. 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 llamadas 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.
En este tutorial de C ++, aprenderá:
- ¿Qué son los punteros?
- Direcciones en C ++
- Sintaxis de declaración de puntero
- Operador de referencia (&) y operador de deferencia (*)
- Punteros y matrices
- Puntero nulo
- Punteros de variables
- Aplicación de punteros
- Ventajas de usar punteros
Direcciones en C ++
Para comprender los punteros de C ++, debe comprender cómo las computadoras almacenan datos.
Cuando crea una variable en su programa C ++, 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 el operador & (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 declaración de C ++ toma la siguiente sintaxis:
datatype *variable_name;
- El tipo de datos es el tipo base del puntero, que debe ser un tipo de datos C ++ válido.
- El nombre_variable debe ser el nombre de la variable de puntero.
- El asterisco utilizado anteriormente para la declaración de puntero es similar al asterisco utilizado para realizar la operación de multiplicación. Es el asterisco 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 integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *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:
#includeusing 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;}
Producción:
Como funciona esto:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Importe el archivo de encabezado de 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 main (). 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 debe 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í denota la dirección base de la matriz. Esto significa que para asignar la dirección de una matriz a un puntero, no debe usar un ampersand (&).
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 atravesar una matriz usando punteros:
#includeusing 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;}
Producción:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Declare una variable de puntero entero ip.
- Declare una matriz llamada arr y almacene 6 enteros en ella.
- Asignar arr a ip. La ip y arr se convertirán en equivalentes.
- Crea un bucle for a. La variable de bucle x se creó para iterar sobre los elementos de la matriz desde el índice 0 al 5.
- Imprime los valores almacenados en la dirección de la IP del puntero. Se devolverá un valor por iteración y se realizarán un total de 6 repeticiones. Endl es una palabra clave de C ++ 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 para un bucle.
- El programa debe devolver algo después de una ejecución exitosa.
- Fin del cuerpo de la función main ().
Puntero nulo
Si no hay una dirección exacta que se deba asignar, entonces se puede asignar un NULL a la variable de puntero. Debe hacerse durante la declaración. Dicho puntero se conoce como puntero nulo. Su valor es cero y está definido en muchas bibliotecas estándar como iostream.
Ejemplo 3:
#includeusing namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}
Producción:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Declare una variable de puntero ip y asígnele un valor de NULL.
- Imprime el valor de la variable de 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 como 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 apuntada por otra variable.
Puede declararse de la siguiente manera:
int *p;
O,
int* p;
En el ejemplo de you, hemos declarado la variable de puntero p.
Tendrá 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:
#includeusing namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}
Producción:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Declare una variable de puntero py una variable x con un valor de 30.
- Asigne la dirección de la variable xa 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 punteros
Las funciones en C ++ pueden devolver solo un valor. Además, todas las variables declaradas en una función se asignan en la pila de llamadas de función. Tan pronto como la función regresa, todas las variables de la pila se destruyen.
Los argumentos para la función se pasan por valor, y cualquier modificación realizada en las variables no cambia el valor de las variables reales que se pasan. El siguiente ejemplo ayuda a ilustrar este concepto:
Ejemplo 5:
#includeusing 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;}
Producción:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Cree un prototipo de una función llamada prueba que tomará dos parámetros enteros.
- Llame a la función main (). Agregaremos la lógica del programa dentro de su cuerpo.
- Declare dos variables enteras ayb, cada una con un valor de 5.
- Imprime algo de texto en la consola. El final (línea final) moverá el cursor para comenzar a imprimir en la siguiente línea.
- Imprime el valor de la variable a en la consola junto con otro texto. El final (línea final) moverá el cursor para comenzar a imprimir en la siguiente línea.
- Imprime el valor de la variable b en la consola junto con otro texto. El final (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 ayb como parámetros.
- Imprime algo de texto en la consola. \ N creará una nueva línea en blanco antes de que se imprima el texto. El final (línea final) moverá el cursor para comenzar a imprimir en la siguiente línea después de que se imprima el texto.
- Imprime el valor de la variable a en la consola junto con otro texto. El final (línea final) moverá el cursor para comenzar a imprimir en la siguiente línea.
- Imprime el valor de la variable b en la consola junto con otro texto. El final (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 ().
- Definición de la función test (). La función debe tomar dos variables de puntero enteras * 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 la variable ayb dentro de la prueba de función, una vez que se completa la llamada a la función, lo mismo no se refleja en la función externa main.
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 de llamada 'principal'.
Ventajas de usar punteros
Aquí están los pros / beneficios de usar Pointers
- Los punteros son variables que almacenan la dirección de otras 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 dirección de retención de variable 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.
- Las matrices y los punteros utilizan un concepto relacionado.
- El nombre de la matriz denota la base de la matriz.
- Si desea asignar la dirección de una matriz a un puntero, no use un ampersand (&).
- Si no hay una dirección específica para asignar una variable de puntero, asígnele un NULL.