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:

Operador de referencia (&) y operador de deferencia (*)

Cómo funciona esto:

Operador de referencia (&) y operador de deferencia (*)

Aquí hay una captura de pantalla del código:

Operador de referencia (&) y operador de deferencia (*)

Explicación del código:

  1. Importe el archivo de encabezado iostream. Esto nos permitirá utilizar las funciones definidas en el archivo de encabezado sin obtener errores.
  2. Incluya el espacio de nombres estándar para usar sus clases sin llamarlo.
  3. 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.
  4. Declare una variable entera x y asígnele un valor de 27.
  5. Declare una variable de puntero *ip.
  6. Almacene la dirección de la variable x en la variable de puntero.
  7. Imprime algo de texto en la consola.
  8. Imprime el valor de la variable x en la pantalla.
  9. Imprime algo de texto en la consola.
  10. Imprime la dirección de la variable x. El valor de la dirección se almacenó en la variable ip.
  11. Imprime algo de texto en la consola.
  12. Imprime el valor almacenado en la dirección del puntero.
  13. El programa debería devolver valor tras una ejecución exitosa.
  14. 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:

Punteros y matrices

Aquí hay una captura de pantalla del código:

Punteros y matrices

Explicación del código:

  1. Declare una variable de puntero entero ip.
  2. Declare una matriz llamada arr y almacene 6 números enteros en ella.
  3. Asigne arr a ip. La ip y arr serán equivalentes.
  4. Crea un bucle for. La variable de bucle x se creó para iterar sobre los elementos de la matriz del índice 0 al 5.
  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.
  6. Para mover el puntero a la siguiente posición int después de cada iteración.
  7. Fin del bucle for.
  8. El programa debe devolver algo tras una ejecución exitosa.
  9. 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:

Puntero nulo

Aquí hay una captura de pantalla del código:

Puntero nulo

Explicación del código:

  1. Declare una variable de puntero ip y asígnele un valor NULL.
  2. Imprima el valor de la variable del puntero ip junto con algún texto en la consola.
  3. El programa debe devolver valor una vez completado con éxito.
  4. Fin del cuerpo de la función main().

Punteros de variables

En nuestro 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,

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:

Punteros de variables

Aquí hay una captura de pantalla del código:

Punteros de variables

Explicación del código:

  1. Declare una variable de puntero p y una variable x con un valor de 30.
  2. Asigne la dirección de la variable x a p.
  3. Imprima el valor de la variable de puntero p junto con algún texto en la consola.
  4. El programa debe devolver valor una vez completado con éxito.
  5. 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:

Aplicación de consejos

Aquí hay una captura de pantalla del código:

Aplicación de consejos

Explicación del código:

  1. Cree un prototipo de una función llamada prueba que tomará dos parámetros enteros.
  2. Llame a la función principal(). Agregaremos la lógica del programa dentro de su cuerpo.
  3. Declare dos variables enteras a y b, cada una con un valor de 5.
  4. Imprime algo de texto en la consola. El endl (línea final) moverá el cursor para comenzar a imprimir en la siguiente línea.
  5. 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.
  6. 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.
  7. Cree una función llamada test() que tome las direcciones de las variables a y b como parámetros.
  8. 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.
  9. 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.
  10. 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.
  11. El programa debe devolver valor una vez completado con éxito.
  12. Fin del cuerpo de la función main().
  13. Definiendo la función test(). La función debe tomar dos variables de puntero entero *n1 y *n2.
  14. Asignar a la variable de puntero *n1 un valor de 10.
  15. Asignar a la variable de puntero *n2 un valor de 11.
  16. 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.