Il puntatore in linguaggio C è una variabile che memorizza l'indirizzo di un'altra variabile. Questa variabile può essere di tipo int, char, array, funzione o qualsiasi altro puntatore. La dimensione del puntatore dipende dall'architettura. Tuttavia, nell'architettura a 32 bit la dimensione di un puntatore è 2 byte.
Considera l'esempio seguente per definire un puntatore che memorizza l'indirizzo di un numero intero.
int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer.
Dichiarazione di un puntatore
Il puntatore in linguaggio c può essere dichiarato utilizzando * (simbolo asterisco). È anche noto come puntatore indiretto utilizzato per dereferenziare un puntatore.
int *a;//pointer to int char *c;//pointer to char
Esempio di puntatore
Di seguito è riportato un esempio di utilizzo dei puntatori per stampare l'indirizzo e il valore.
Come puoi vedere nella figura sopra, la variabile puntatore memorizza l'indirizzo della variabile numerica, ovvero fff4. Il valore della variabile numerica è 50. Ma l'indirizzo della variabile puntatore p è aaa3.
Con l'aiuto di * ( operatore indiretto ), possiamo stampare il valore della variabile puntatore p.
delizia soleggiata
Vediamo l'esempio del puntatore come spiegato per la figura sopra.
#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; }
Produzione
esempi di programmazione Python
Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50
Puntatore all'array
int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr.
Puntatore a una funzione
void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function
Puntatore alla struttura
struct st { int i; float f; }ref; struct st *p = &ref;
Vantaggio del puntatore
1) Puntatore riduce il codice E migliora le prestazioni , viene utilizzato per recuperare stringhe, alberi, ecc. e utilizzato con matrici, strutture e funzioni.
2) Possiamo restituire più valori da una funzione utilizzando il puntatore.
3) Ti rende capace di farlo accedere a qualsiasi posizione di memoria nella memoria del computer.
Utilizzo del puntatore
Esistono molte applicazioni dei puntatori nel linguaggio c.
1) Allocazione dinamica della memoria
Nel linguaggio C, possiamo allocare dinamicamente la memoria utilizzando le funzioni malloc() e calloc() in cui viene utilizzato il puntatore.
2) Array, funzioni e strutture
I puntatori in linguaggio C sono ampiamente utilizzati in array, funzioni e strutture. Riduce il codice e migliora le prestazioni.
Indirizzo dell'operatore (&).
L'indirizzo dell'operatore '&' restituisce l'indirizzo di una variabile. Ma dobbiamo usare %u per visualizzare l'indirizzo di una variabile.
jquery un clic
#include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; }
Produzione
value of number is 50, address of number is fff4
Puntatore NULL
Un puntatore a cui non viene assegnato alcun valore tranne NULL è noto come puntatore NULL. Se non hai alcun indirizzo da specificare nel puntatore al momento della dichiarazione, puoi assegnare il valore NULL. Fornirà un approccio migliore.
int *p=NULL;
Nella maggior parte delle librerie, il valore del puntatore è 0 (zero).
Puntatore Programma per scambiare due numeri senza utilizzare la terza variabile.
#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; }
Produzione
Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10
Lettura di puntatori complessi
Ci sono diverse cose che devono essere prese in considerazione durante la lettura dei puntatori complessi in C. Vediamo la precedenza e l'associatività degli operatori che vengono utilizzati riguardo ai puntatori.
Operatore | Precedenza | Associatività |
---|---|---|
(), [] | 1 | Da sinistra a destra |
*, identificatore | 2 | Da destra a sinistra |
Tipo di dati | 3 | - |
Qui, dobbiamo notare che,
- (): questo operatore è un operatore tra parentesi utilizzato per dichiarare e definire la funzione.
- []: questo operatore è un operatore di indice di matrice
- * : Questo operatore è un operatore puntatore.
- Identificatore: è il nome del puntatore. A questo verrà sempre assegnata la priorità.
- Tipo di dati: il tipo di dati è il tipo della variabile a cui deve puntare il puntatore. Include anche il modificatore come Signed Int, Long, ecc.).
Come leggere il puntatore: int (*p)[10].
Per leggere il puntatore, dobbiamo vedere che () e [] hanno la stessa precedenza. Pertanto, la loro associatività deve essere considerata qui. L'associatività va da sinistra a destra, quindi la priorità va a ().
All'interno della parentesi (), l'operatore del puntatore * e il nome del puntatore (identificatore) p hanno la stessa precedenza. Pertanto, qui deve essere considerata la loro associatività che è da destra a sinistra, quindi la priorità va a p, e la seconda priorità va a *.
un esempio di sistema operativo open source è
Assegnare la terza priorità a [] poiché il tipo di dati ha l'ultima precedenza. Pertanto il puntatore apparirà come segue.
- carattere -> 4
- * -> 2
- p -> 1
- [10] -> 3
Il puntatore verrà letto come p è un puntatore a un array di numeri interi di dimensione 10.
Esempio
Come leggere il seguente puntatore?
int (*p)(int (*)[2], int (*)void))
Spiegazione
Questo puntatore verrà letto come p è un puntatore a tale funzione che accetta il primo parametro come puntatore a un array unidimensionale di numeri interi di dimensione due e il secondo parametro come puntatore a una funzione il cui parametro è void e il tipo restituito è l'intero.