logo

Puntatori C

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.

esempio di puntatore

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; 
puntatori c

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.

OperatorePrecedenzaAssociatività
(), []1Da sinistra a destra
*, identificatore2Da destra a sinistra
Tipo di dati3-

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.