pointers pointer operations c
Un estudio intensivo de punteros y sus usos en C ++.
Un puntero es una de las características más poderosas del lenguaje C ++. Un puntero ayuda a manipular las variables a través de su dirección.
aplicación para programar publicaciones de instagram gratis
En este tutorial, exploraremos todo sobre punteros y sus usos en C ++ en detalle.
=> Tenga cuidado con la serie de capacitación simple de C ++ aquí.
Lo que vas a aprender:
- ¿Qué es un puntero?
- Aritmética de punteros
- Punteros nulos y nulos
- Matrices y punteros
- Matriz de punteros
- Puntero de punteros
- Pasar punteros a funciones
- Punteros de función
- Conclusión
- Lectura recomendada
¿Qué es un puntero?
Un puntero es una variable que contiene la dirección de una ubicación de memoria. Sabemos que todas las variables que declaramos, tienen una dirección específica en la memoria. Declaramos una variable de puntero para apuntar a estas direcciones en la memoria.
La sintaxis general para declarar una variable de puntero es:
|_+_|Por ejemplo, la declaracion int * ptr;
Esto significa que ptr es un puntero que apunta a una variable de tipo int. Por lo tanto, una variable de puntero siempre contiene una ubicación o dirección de memoria. Veamos el funcionamiento de las variables de puntero a continuación.
Considere que tenemos las siguientes declaraciones:
|_+_|En memoria, estas declaraciones se representarán de la siguiente manera:

Esta es la representación interna del puntero en la memoria. Cuando asignamos la variable de dirección a la variable de puntero, apunta a la variable como se muestra en la representación anterior.
Como ptr tiene una dirección de variable p, * ptr dará el valor de la variable p (variable a la que apunta la variable puntero ptr).
Nota: El operador * que usamos con el puntero se usa para denotar que es una variable de puntero.
Veamos algunos de los conceptos de puntero que se utilizan en C ++.
Aritmética de punteros
Sabemos que una variable de puntero siempre apunta a la dirección en la memoria. Entre las operaciones que podemos realizar, tenemos las siguientes operaciones aritméticas que se realizan sobre punteros.
- Operador de incremento (++)
- Operador de disminución (-)
- Suma (+)
- Resta (-)
Veamos el uso de estas operaciones en un programa de ejemplo.
|_+_|Producción:
Primer elemento de la matriz: 2
siguiente elemento de la matriz: 4
siguiente elemento de la matriz: 6
siguiente elemento de la matriz: 4
siguiente elemento de la matriz: 2
Hemos visto las operaciones aritméticas llevadas a cabo sobre punteros. Tenga en cuenta que el operador de incremento ++ incrementa el puntero y apunta al siguiente elemento de la matriz. De manera similar, el operador de decremento reduce la variable de puntero en 1 para que apunte al elemento anterior de la matriz.
También usamos operadores + y -. Primero, hemos agregado 1 a la variable de puntero. El resultado muestra que apunta al siguiente elemento de la matriz. De manera similar, el operador - hace que la variable de puntero apunte al elemento anterior en la matriz.
Aparte de estos operadores aritméticos, también podemos usar operadores de comparación como ==,.
Punteros nulos y nulos
Si, en el caso, a una variable de puntero no se le asigna una dirección de una variable, entonces es una buena práctica asignar un valor NULL a la variable de puntero. La variable de puntero con un valor NULL se denomina puntero NULL.
Un puntero nulo es un puntero constante con valor cero definido en el encabezado de iostream. La memoria en la dirección 0 está reservada por el sistema operativo y no podemos acceder a esta ubicación.
Usando el puntero nulo, podemos evitar el mal uso de punteros no utilizados y evitar que las variables de puntero tengan algunos valores basura asignados.
Los punteros vacíos son los punteros especiales que apuntan a los valores sin tipo. Los punteros vacíos son más flexibles ya que pueden apuntar a cualquier tipo. Pero no se pueden desreferenciar directamente. Para eliminar las referencias, el puntero vacío debe convertirse en un puntero que apunte a un valor con el tipo de datos concreto.
Hemos mostrado el funcionamiento del puntero NULL y el puntero vacío en el siguiente ejemplo de código.
|_+_|Producción:
Valor de puntero NULL: 0
El puntero vacío vptr apunta a: A
El puntero vacío vptr apunta a: 10
En el programa anterior, primero declaramos un puntero entero al que se le asigna un valor NULL. Cuando imprimimos este puntero, vemos que el valor es 0 como hemos comentado anteriormente.
A continuación, declaramos un puntero vacío. Primero, asignamos una dirección de variable de carácter a este puntero vacío. Luego asignamos un puntero vacío a un puntero de carácter y lo encasillamos con char *. A continuación, imprimimos el valor charptr que apunta a char A, que era una variable de carácter que declaramos anteriormente y que apunta con el puntero void.
A continuación, hemos asignado una variable entera al puntero vacío y luego llevamos a cabo los mismos pasos de desreferenciar este puntero vacío utilizando un puntero entero.
Matrices y punteros
Las matrices y los punteros están fuertemente asociados entre sí. Sabemos que el nombre de la matriz apunta al primer elemento de la matriz y este es un puntero constante.
Podemos asignar este puntero a una variable de puntero y luego acceder a la matriz disminuyendo el puntero o usando el operador de subíndice.
Veremos esta asociación entre la variable de puntero y la matriz en el siguiente ejemplo de código.
|_+_|Producción:
1 1 2 3 5
diferencia entre c ++ y java
En el programa anterior, asignamos el nombre de la matriz a una variable de puntero. Como el nombre de la matriz apunta al primer elemento de la matriz, podemos imprimir el contenido de toda la matriz usando una variable de puntero e incrementarlo usando el operador ++. Esto se muestra en la salida.
Matriz de punteros
A veces, necesitamos más de una variable de puntero en un programa. En lugar de declarar cada variable de puntero individual, podemos declarar una matriz de punteros.
Tomemos de inmediato un ejemplo para demostrar una serie de punteros.
|_+_|Producción:
Valor de myarray (0) = 2
Valor de myarray (1) = 4
Valor de myarray (2) = 6
Valor de myarray (3) = 8
Valor de myarray (4) = 10
En la declaración anterior,
int * ptr (5);
Podemos interpretar como; ptr es una matriz de 5 punteros enteros. Por tanto, cada elemento de ptr apuntará a una variable de tipo entero.
Hacemos uso de una matriz de enteros y asignamos la dirección de cada elemento de la matriz a cada uno de los elementos ptr. Luego mostramos el contenido de la matriz ptr generando “* ptr (i)”.
Puntero de punteros
El puntero de punteros no es más que múltiples indirecciones. Es una especie de cadena de punteros. Cuando definimos un puntero de punteros, el primer puntero tiene una dirección del segundo puntero, que a su vez tiene la dirección de la variable a la que apunta.
En la memoria, esto se representará como:

Un puntero de punteros se declara de la siguiente manera:
|_+_|Tomamos directamente un ejemplo de código para comprender mejor el puntero de punteros.
|_+_|Producción:
Variable var: 10
Puntero a variable: 10
Puntero a puntero a una variable: 10
En el programa anterior, declaramos una variable de número entero, un puntero de número entero y un puntero de un puntero a un número entero. Como se muestra en el programa, a la variable de puntero se le asigna el valor de una variable. Al puntero de la variable de puntero se le asigna la dirección de la variable de puntero.
Al final, imprimimos las tres variables que muestran el mismo valor 10 igual a una variable entera.
Pasar punteros a funciones
Pasar punteros a la función es lo mismo que otras técnicas de paso de parámetros en las que pasamos variables de puntero a la función.
Revisamos nuestro intercambio de dos valores y lo modificamos para pasar variables de puntero como parámetros.
|_+_|Producción:
Introduzca los valores a intercambiar: 3 2
a = 3 b = 2
Valores intercambiados
a = 2 b = 3
Como se muestra en el programa, pasamos los valores a intercambiar como variables enteras. Los parámetros formales se definen como variables de puntero. Como resultado de esto, los cambios realizados en las variables dentro de las funciones también se reflejan en el exterior de la función que llama.
Punteros de función
De la misma manera, como tenemos punteros a variables, matrices, etc., también podemos tener punteros a funciones. Pero la diferencia es que el puntero de la función apunta al código ejecutable y no a datos como variables o matrices.
Tomamos un ejemplo para demostrar los punteros de función.
|_+_|Producción:
El valor de a es 100
preguntas y respuestas de la entrevista de prueba de software para 2 años de experiencia
En el programa anterior, tenemos una función 'displayVal' que simplemente imprime un valor entero que se le pasa. En la función principal, hemos definido un puntero de función 'func_ptr' que toma un int como argumento y devuelve un tipo void.
void (* func_ptr) (int)
Nota: Necesitamos encerrar el puntero de función dentro de (). Si lo omitimos, se convertirá en un prototipo de función.
Hemos asignado la dirección de la función 'displayVal' a este puntero de función. Luego, usando este puntero de función 'func_ptr' pasamos el valor del argumento 100, que es equivalente a llamar a displayVal con el argumento 100.
Ahora, si tenemos otra función con el mismo prototipo, entonces podemos usar el mismo puntero de función asignándole la dirección de la función. Este es el uso principal de los punteros de función.
Conclusión
Se trata de punteros, sus definiciones y usos en C ++.
En nuestro próximo tutorial, aprenderemos más sobre referencias en C ++. Las referencias también tienen un uso especial en C ++ y a menudo se utilizan como alias para variables.
=> Haga clic aquí para ver la serie de capacitación Absolute C ++.