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.
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;
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.
Operador | Precedencia | asociatividad |
---|---|---|
(), [] | 1 | De izquierda a derecha |
*, identificador | 2 | De derecha a izquierda |
Tipo de datos | 3 | - |
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.