C - Punteros

Los punteros en C son fáciles y divertidos de aprender. Algunas tareas de programación de C se realizan más fácilmente con punteros, y otras tareas, como la asignación de memoria dinámica, no se pueden realizar sin usar punteros. Por lo tanto, es necesario aprender los consejos para convertirse en un programador C perfecto. Comencemos a aprenderlos en pasos simples y sencillos.

Como sabe, cada variable es una ubicación de memoria y cada ubicación de memoria tiene su dirección definida a la que se puede acceder usando el operador y comercial (&), que denota una dirección en la memoria. Considere el siguiente ejemplo, que imprime la dirección de las variables definidas:

#include <stdio.h>

int main () {

   int  var1;
   char var2[10];

   printf("Address of var1 variable: %x\n", &var1  );
   printf("Address of var2 variable: %x\n", &var2  );

   return 0;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Address of var1 variable: bff5a400
Address of var2 variable: bff5a3f6

¿Qué son los punteros?

UNA pointeres una variable cuyo valor es la dirección de otra variable, es decir, la dirección directa de la ubicación de la memoria. Como cualquier variable o constante, debe declarar un puntero antes de usarlo para almacenar cualquier dirección de variable. La forma general de una declaración de variable de puntero es:

type *var-name;

Aquí, typees el tipo base del puntero; debe ser un tipo de datos C válido yvar-namees el nombre de la variable de puntero. El asterisco * utilizado para declarar un puntero es el mismo asterisco utilizado para la multiplicación. Sin embargo, en esta declaración, el asterisco se utiliza para designar una variable como puntero. Eche un vistazo a algunas de las declaraciones de puntero válidas:

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

El tipo de datos real del valor de todos los punteros, ya sean enteros, flotantes, de carácter u otros, es el mismo, un número hexadecimal largo que representa una dirección de memoria. La única diferencia entre punteros de diferentes tipos de datos es el tipo de datos de la variable o constante a la que apunta el puntero.

¿Cómo utilizar los punteros?

Hay algunas operaciones importantes que haremos con la ayuda de punteros con mucha frecuencia. (a) Definimos una variable de puntero, (b) asignar la dirección de una variable a un puntero y (c)finalmente acceda al valor en la dirección disponible en la variable de puntero. Esto se hace usando un operador unario*que devuelve el valor de la variable ubicada en la dirección especificada por su operando. El siguiente ejemplo hace uso de estas operaciones:

#include <stdio.h>

int main () {

   int  var = 20;   /* actual variable declaration */
   int  *ip;        /* pointer variable declaration */

   ip = &var;  /* store address of var in pointer variable*/

   printf("Address of var variable: %x\n", &var  );

   /* address stored in pointer variable */
   printf("Address stored in ip variable: %x\n", ip );

   /* access the value using the pointer */
   printf("Value of *ip variable: %d\n", *ip );

   return 0;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20

Punteros NULL

Siempre es una buena práctica asignar un valor NULL a una variable de puntero en caso de que no tenga una dirección exacta para asignar. Esto se hace en el momento de la declaración de la variable. Un puntero al que se le asigna NULL se llamanull puntero.

El puntero NULL es una constante con un valor de cero definido en varias bibliotecas estándar. Considere el siguiente programa:

#include <stdio.h>

int main () {

   int  *ptr = NULL;

   printf("The value of ptr is : %x\n", ptr  );
 
   return 0;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

The value of ptr is 0

En la mayoría de los sistemas operativos, los programas no pueden acceder a la memoria en la dirección 0 porque esa memoria está reservada por el sistema operativo. Sin embargo, la dirección de memoria 0 tiene un significado especial; indica que el puntero no está destinado a apuntar a una ubicación de memoria accesible. Pero por convención, si un puntero contiene el valor nulo (cero), se supone que no apunta a nada.

Para verificar si hay un puntero nulo, puede usar una declaración 'if' de la siguiente manera:

if(ptr)     /* succeeds if p is not null */
if(!ptr)    /* succeeds if p is null */

Punteros en detalle

Los punteros tienen muchos conceptos, pero fáciles, y son muy importantes para la programación en C. Los siguientes conceptos importantes de punteros deben ser claros para cualquier programador de C:

No Señor. Concepto y descripción
1 Aritmética de punteros

Hay cuatro operadores aritméticos que se pueden usar en punteros: ++, -, +, -

2 Matriz de punteros

Puede definir matrices para contener varios punteros.

3 Puntero a puntero

C le permite tener un puntero en un puntero y así sucesivamente.

4 Pasando punteros a funciones en C

Pasar un argumento por referencia o por dirección permite que el argumento pasado sea cambiado en la función llamada por la función llamada.

5 Puntero de retorno de funciones en C

C permite que una función devuelva un puntero a la variable local, variable estática y también a la memoria asignada dinámicamente.