logo

Punteros C

El puntero en lenguaje C es una variable que almacena la dirección de otra variable. Esta variable puede ser de tipo int, char, matriz, función o cualquier otro puntero. El tamaño del puntero depende de la arquitectura. Sin embargo, en la arquitectura de 32 bits el tamaño de un puntero es de 2 bytes.

Considere el siguiente ejemplo para definir un puntero que almacena la dirección de un número entero.

 int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer. 

Declarando un puntero

El puntero en lenguaje c se puede declarar usando * (símbolo de asterisco). También se conoce como puntero de indirección y se utiliza para desreferenciar un puntero.

 int *a;//pointer to int char *c;//pointer to char 

Ejemplo de puntero

A continuación se proporciona un ejemplo del uso de punteros para imprimir la dirección y el valor.

ejemplo de puntero

Como puede ver en la figura anterior, la variable de puntero almacena la dirección de la variable numérica, es decir, fff4. El valor de la variable numérica es 50. Pero la dirección de la variable de puntero p es aaa3.

Con la ayuda de * ( operador de indirección ), podemos imprimir el valor de la variable de puntero p.

matriz de cadenas en lenguaje c

Veamos el ejemplo del puntero como se explica en la figura anterior.

 #include int main(){ int number=50; int *p; p=&number;//stores the address of number variable printf('Address of p variable is %x 
',p); // p contains the address of the number therefore printing p gives the address of number. printf('Value of p variable is %d 
',*p); // As we know that * is used to dereference a pointer therefore if we print *p, we will get the value stored at the address contained by p. return 0; } 

Producción

clase vs objeto en java
 Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50 

Puntero a matriz

 int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr. 

Puntero a una función

 void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function 

Puntero a la estructura

 struct st { int i; float f; }ref; struct st *p = &ref; 
c punteros

Ventaja del puntero

1) puntero reduce el código y mejora el rendimiento , se utiliza para recuperar cadenas, árboles, etc. y se utiliza con matrices, estructuras y funciones.

2) Podemos devolver múltiples valores de una función usando el puntero.

3) Te hace capaz de acceder a cualquier ubicación de memoria en la memoria de la computadora.

Uso del puntero

Hay muchas aplicaciones de punteros en lenguaje c.

1) Asignación de memoria dinámica

En lenguaje c, podemos asignar memoria dinámicamente usando las funciones malloc() y calloc() donde se usa el puntero.

2) Matrices, funciones y estructuras

Los punteros en lenguaje c se utilizan ampliamente en matrices, funciones y estructuras. Reduce el código y mejora el rendimiento.

Dirección del (&) operador

La dirección del operador '&' devuelve la dirección de una variable. Pero necesitamos usar %u para mostrar la dirección de una variable.

 #include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; } 

Producción

 value of number is 50, address of number is fff4 

Puntero nulo

Un puntero al que no se le asigna ningún valor excepto NULL se conoce como puntero NULL. Si no tiene ninguna dirección para especificar en el puntero en el momento de la declaración, puede asignar un valor NULL. Proporcionará un mejor enfoque.

látex derivado parcial
 int *p=NULL; 

En la mayoría de las bibliotecas, el valor del puntero es 0 (cero).

Programa de puntero para intercambiar dos números sin utilizar la tercera variable.

 #include int main(){ int a=10,b=20,*p1=&a,*p2=&b; printf('Before swap: *p1=%d *p2=%d',*p1,*p2); *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; printf('
After swap: *p1=%d *p2=%d',*p1,*p2); return 0; } 

Producción

 Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10 

Lectura de punteros complejos

Hay varias cosas que se deben tener en cuenta al leer los punteros complejos en C. Veamos la precedencia y asociatividad de los operadores que se utilizan con respecto a los punteros.

OperadorPrecedenciaasociatividad
(), []1De izquierda a derecha
*, identificador2De derecha a izquierda
Tipo de datos3-

Aquí debemos notar que,

  • (): Este operador es un operador de corchetes que se utiliza para declarar y definir la función.
  • []: Este operador es un operador de subíndice de matriz
  • * : Este operador es un operador de puntero.
  • Identificador: Es el nombre del puntero. La prioridad siempre será asignada a esto.
  • Tipo de datos: el tipo de datos es el tipo de variable a la que apunta el puntero. También incluye el modificador como int firmado, largo, etc.).

Cómo leer el puntero: int (*p)[10].

Para leer el puntero, debemos ver que () y [] tienen la misma precedencia. Por tanto, aquí debe considerarse su asociatividad. La asociatividad es de izquierda a derecha, por lo que la prioridad es ().

Dentro del corchete (), el operador de puntero * y el nombre del puntero (identificador) p tienen la misma prioridad. Por lo tanto, aquí se debe considerar su asociatividad que es de derecha a izquierda, por lo que la prioridad va a p y la segunda prioridad va a *.

fecha java a cadena

Asigne la tercera prioridad a [] ya que el tipo de datos tiene la última prioridad. Por lo tanto, el puntero tendrá el siguiente aspecto.

  • carácter -> 4
  • * -> 2
  • pag -> 1
  • [10] -> 3

El puntero se leerá como p es un puntero a una matriz de números enteros de tamaño 10.

Ejemplo

¿Cómo leer el siguiente puntero?

 int (*p)(int (*)[2], int (*)void)) 

Explicación

Este puntero se leerá como p es un puntero a dicha función que acepta el primer parámetro como puntero a una matriz unidimensional de números enteros de tamaño dos y el segundo parámetro como puntero a una función cuyo parámetro es nulo y el tipo de retorno es el número entero.