C - Puntatori
I puntatori in C sono facili e divertenti da imparare. Alcune attività di programmazione in C vengono eseguite più facilmente con i puntatori e altre attività, come l'allocazione dinamica della memoria, non possono essere eseguite senza utilizzare i puntatori. Quindi diventa necessario imparare i puntatori per diventare un perfetto programmatore C. Cominciamo ad apprenderli in passaggi semplici e facili.
Come sapete, ogni variabile è una posizione di memoria e ogni posizione di memoria ha il proprio indirizzo definito a cui è possibile accedere utilizzando l'operatore e commerciale (&), che denota un indirizzo in memoria. Considera il seguente esempio, che stampa l'indirizzo delle variabili definite:
#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;
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
Address of var1 variable: bff5a400
Address of var2 variable: bff5a3f6
Cosa sono i puntatori?
UN pointerè una variabile il cui valore è l'indirizzo di un'altra variabile, cioè l'indirizzo diretto della posizione di memoria. Come qualsiasi variabile o costante, è necessario dichiarare un puntatore prima di utilizzarlo per memorizzare qualsiasi indirizzo di variabile. La forma generale di una dichiarazione di variabile puntatore è:
type *var-name;
Qui, typeè il tipo di base del puntatore; deve essere un tipo di dati C valido evar-nameè il nome della variabile del puntatore. L'asterisco * utilizzato per dichiarare un puntatore è lo stesso asterisco utilizzato per la moltiplicazione. Tuttavia, in questa istruzione l'asterisco viene utilizzato per designare una variabile come puntatore. Dai un'occhiata ad alcune delle dichiarazioni di puntatore valide -
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */
Il tipo di dati effettivo del valore di tutti i puntatori, se intero, float, carattere o altro, è lo stesso, un numero esadecimale lungo che rappresenta un indirizzo di memoria. L'unica differenza tra i puntatori di diversi tipi di dati è il tipo di dati della variabile o della costante a cui punta il puntatore.
Come usare i puntatori?
Ci sono alcune operazioni importanti, che faremo molto frequentemente con l'aiuto dei puntatori. (a) Definiamo una variabile puntatore, (b) assegna l'indirizzo di una variabile a un puntatore e (c)accedere infine al valore all'indirizzo disponibile nella variabile pointer. Questo viene fatto utilizzando l'operatore unario*che restituisce il valore della variabile situata all'indirizzo specificato dal suo operando. Il seguente esempio fa uso di queste operazioni:
#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;
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20
Puntatori NULL
È sempre buona norma assegnare un valore NULL a una variabile puntatore nel caso in cui non si abbia un indirizzo esatto da assegnare. Questo viene fatto al momento della dichiarazione della variabile. Un puntatore a cui è assegnato NULL è chiamato anull puntatore.
Il puntatore NULL è una costante con un valore zero definito in diverse librerie standard. Considera il seguente programma:
#include <stdio.h>
int main () {
int *ptr = NULL;
printf("The value of ptr is : %x\n", ptr );
return 0;
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
The value of ptr is 0
Nella maggior parte dei sistemi operativi, ai programmi non è consentito accedere alla memoria all'indirizzo 0 perché tale memoria è riservata dal sistema operativo. Tuttavia, l'indirizzo di memoria 0 ha un significato speciale; segnala che il puntatore non è destinato a puntare a una posizione di memoria accessibile. Ma per convenzione, se un puntatore contiene il valore null (zero), si presume che punti a nulla.
Per verificare la presenza di un puntatore nullo, puoi utilizzare un'istruzione 'if' come segue:
if(ptr) /* succeeds if p is not null */
if(!ptr) /* succeeds if p is null */
Puntatori in dettaglio
I puntatori hanno molti ma semplici concetti e sono molto importanti per la programmazione C. I seguenti importanti concetti relativi ai puntatori dovrebbero essere chiari a qualsiasi programmatore C:
Sr.No. | Concetto e descrizione |
---|---|
1 | Puntatore aritmetico Ci sono quattro operatori aritmetici che possono essere usati nei puntatori: ++, -, +, - |
2 | Matrice di puntatori È possibile definire array per contenere un numero di puntatori. |
3 | Puntatore al puntatore C ti consente di avere un puntatore su un puntatore e così via. |
4 | Passaggio di puntatori a funzioni in C Il passaggio di un argomento per riferimento o per indirizzo consente di modificare l'argomento passato nella funzione chiamante dalla funzione chiamata. |
5 | Restituisce il puntatore dalle funzioni in C C consente a una funzione di restituire un puntatore alla variabile locale, alla variabile statica e anche alla memoria allocata dinamicamente. |