¿Qué es el puntero en C?
El puntero en C, es una variable que almacena la dirección de otra variable. Un puntero también se puede utilizar para hacer referencia a otra función de puntero. Un puntero se puede incrementar / disminuir, es decir, para apuntar a la ubicación de memoria siguiente / anterior. El propósito del puntero es ahorrar espacio en la memoria y lograr un tiempo de ejecución más rápido.
Cómo usar punteros en C
Si declaramos una variable v de tipo int, v realmente almacenará un valor.
v ahora es igual a cero.
Sin embargo, cada variable, además del valor, también tiene su dirección (o, simplemente, dónde se encuentra en la memoria). La dirección se puede recuperar poniendo un ampersand (&) antes del nombre de la variable.
Si imprime la dirección de una variable en la pantalla, se verá como un número totalmente aleatorio (además, puede ser diferente de una ejecución a otra).
Intentemos esto en la práctica con el puntero en C ejemplo
La salida de este programa es -480613588.
Ahora, ¿qué es un puntero? En lugar de almacenar un valor, un puntero almacenará y la dirección de una variable.
Variable del puntero
Int * y = & v;
VARIABLE |
PUNTERO |
Un valor almacenado en una dirección de memoria / almacenamiento con nombre |
Una variable que apunta a la dirección de almacenamiento / memoria de otra variable |
Declarar un puntero
Al igual que las variables, los punteros en C progra mming deben declararse antes de que puedan usarse en su programa. Los punteros se pueden nombrar como quieras siempre que obedezcan las reglas de denominación de C. Una declaración de puntero tiene la siguiente forma.
data_type * pointer_variable_name;
Aquí,
- data_type es el tipo base del puntero de los tipos de variable de C e indica el tipo de variable a la que apunta el puntero.
- El asterisco (*: el mismo asterisco usado para multiplicación) que es un operador de indirección, declara un puntero.
Veamos algunas declaraciones de puntero válidas en este tutorial de punteros en C:
Inicializar un puntero
Después de declarar un puntero, lo inicializamos como variables estándar con una dirección de variable. Si los punteros en la programación C no están sin inicializar y se utilizan en el programa, los resultados son impredecibles y potencialmente desastrosos.
Para obtener la dirección de una variable, usamos el operador ampersand (&), colocado antes del nombre de una variable cuya dirección necesitamos. La inicialización del puntero se realiza con la siguiente sintaxis.
Sintaxis del puntero
pointer = &variable;
A continuación se proporciona un programa simple para la ilustración del puntero:
Salida:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
Operador | Significado |
* | Tiene 2 propósitos
|
& | Sirve solo para un propósito
|
Tipos de punteros en C
A continuación se muestran los diferentes tipos de punteros en C:
Puntero nulo
Podemos crear un puntero nulo asignando un valor nulo durante la declaración del puntero. Este método es útil cuando no tiene ninguna dirección asignada al puntero. Un puntero nulo siempre contiene el valor 0.
El siguiente programa ilustra el uso de un puntero nulo:
#include <stdio.h>int main(){int *p = NULL; //null pointerprintf("The value inside variable p is:\n%x”,p);return 0;}
Salida:
The value inside variable p is:0
Puntero vacío
En la programación en C, un puntero vacío también se llama como puntero genérico. No tiene ningún tipo de datos estándar. Un puntero vacío se crea utilizando la palabra clave void. Puede usarse para almacenar una dirección de cualquier variable.
El siguiente programa ilustra el uso de un puntero vacío:
#include <stdio.h>int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
Salida:
The size of pointer is:4
Puntero salvaje
Se dice que un puntero es un puntero salvaje si no se está inicializando a nada. Estos tipos de punteros C no son eficientes porque pueden apuntar a una ubicación de memoria desconocida que puede causar problemas en nuestro programa y puede provocar que el programa se bloquee. Siempre se debe tener cuidado al trabajar con punteros salvajes.
El siguiente programa ilustra el uso del puntero salvaje:
#include <stdio.h>int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
Salida
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
Otros tipos de punteros en «c» son los siguientes:
- Puntero colgante
- Puntero complejo
- Puntero cercano
- Puntero lejano
- Puntero enorme
Punteros de acceso directo e indirecto
En C, hay dos formas equivalentes para acceder y manipular un contenido variable
- Acceso directo: usamos directamente el nombre de la variable
- Acceso indirecto: usamos un puntero a la variable
Comprendamos esto con la ayuda del programa siguiente
Después de compilar el programa sin errores, el resultado es:
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Aritmética del puntero en C
Las operaciones del puntero se resumen en la siguiente figura
Operación de prioridad (precedencia)
Cuando trabajamos con punteros C, debemos observar las siguientes reglas de prioridad:
Si un puntero P apunta a una variable X, entonces * P se puede usar siempre que se pueda escribir X.
Las siguientes expresiones son equivalentes:
En el último caso, se necesitan paréntesis: ya que los operadores unarios * y ++ se evalúan de derecha a izquierda, sin los paréntesis el puntero P se incrementaría, no el objeto en el que P apunta.
La siguiente tabla muestra la operación aritmética y básica que se puede utilizar cuando se trabaja con punteros C
Operación | Explicación |
Asignación | int * P1, * P2 P1 = P2; P1 y P2 apuntan a la misma variable entera |
Incremento y decremento | Int * P1; P1 ++; P1–; |
Agregar un desplazamiento (constante) | Esto permite que el puntero mueva N elementos en una tabla. El puntero aumentará o disminuirá N veces el número de bytes del tipo de variable. P1 + 5; |
Punteros C & Matrices con ejemplos
Tradicionalmente, acceder a los elementos de la matriz utilizando su índice, pero este método se puede eliminar utilizando punteros. Los punteros facilitan el acceso a cada elemento de la matriz.
Salida
12345
Agregar un número en particular a un puntero moverá la ubicación del puntero al valor obtenido por una operación de suma. Supongamos que p es un puntero que actualmente apunta a la ubicación de memoria 0 si realizamos la siguiente operación de suma, p + 1 entonces se ejecutará de esta manera:
Dado que p actualmente apunta a la ubicación 0 después de sumar 1, el valor se convertirá en 1 y, por lo tanto, el puntero apuntará a la ubicación de memoria 1.
Punteros y cadenas de C con ejemplos
Una cadena es una matriz de objetos char, que termina con un carácter nulo «\ 0». Podemos manipular cadenas usando punteros. Este puntero en el ejemplo de C explica esta sección
Salida
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!
Otra forma de tratar las cadenas es con una matriz de punteros como la siguiente programa:
Salida:
Please remember these materials:ironcoppergold
Ventajas de los punteros en C
- Los punteros son útiles para acceder ubicaciones de memoria.
- Los punteros proporcionan una forma eficiente de acceder a los elementos de una estructura de matriz.
- Los punteros se utilizan para la asignación dinámica de memoria y para la desasignación.
- Los punteros se utilizan para formar estructuras de datos complejas, como listas vinculadas, gráficos, árboles, etc.
Desventajas de los punteros en C
- Los punteros son un poco complejos para entender.
- Los punteros pueden llevar a varios errores, como fallas de segmentación o pueden acceder a una ubicación de memoria que no es necesaria en absoluto.
- Si se proporciona un valor incorrecto a un puntero, puede causar daños en la memoria.
- Los punteros también son responsables de la pérdida de memoria.
- Los punteros son comparativamente más lentos que los de las variables.
- Los programadores encuentran muy difícil trabajar con los punteros; por lo tanto, es responsabilidad del programador manipular un puntero con cuidado.
Resumen
- Un puntero no es más que una ubicación de memoria donde se almacenan los datos.
- Se utiliza un puntero para acceder a la ubicación de la memoria.
- Hay varios tipos de punteros, como puntero nulo, puntero salvaje, puntero vacío y otros tipos de punteros.
- Los punteros se pueden usar con arreglos y cadenas para acceder a los elementos de manera más eficiente.
- Podemos crear punteros de función para invocar una función de forma dinámica.
- Las operaciones aritméticas se pueden realizar en un puntero, lo que se conoce como aritmética de puntero.
- Los punteros también pueden apuntar a funciones que facilitan la llamada de diferentes funciones en el caso de definir una matriz de punteros.
- Cuando desee tratar diferentes tipos de datos variables, puede use un puntero vacío encasillado.