Punteros en programación C: qué es puntero, tipos y ejemplos

¿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

  1. Declaración de un puntero
  2. Devuelve el valor de la variable referenciada
& Sirve solo para un propósito

  • Devoluciones la dirección de una variable

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

Operaciones de puntero

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:

Adición / incremento de puntero

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.

Write a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *