Cos’è il puntatore in C?
Il puntatore in C è una variabile che memorizza l’indirizzo di un’altra variabile. Un puntatore può essere utilizzato anche per fare riferimento a un’altra funzione del puntatore. Un puntatore può essere incrementato / decrementato, cioè per puntare alla posizione di memoria successiva / precedente. Lo scopo del puntatore è quello di risparmiare spazio in memoria e ottenere tempi di esecuzione più rapidi.
Come usare i puntatori in C
Se dichiariamo una variabile v di tipo int, v memorizzerà effettivamente un valore.
v è uguale a zero ora.
Tuttavia, ogni variabile, a parte il valore, ha anche il suo indirizzo (o, semplicemente, dove si trova nella memoria). L’indirizzo può essere recuperato inserendo una e commerciale (&) prima del nome della variabile.
Se stampi l’indirizzo di una variabile sullo schermo, apparirà come un numero totalmente casuale (inoltre, può essere diverso da run a run).
Proviamolo in pratica con il puntatore in C esempio
L’output di questo programma è -480613588.
Cos’è un puntatore? Invece di memorizzare un valore, un puntatore y memorizzerà l’indirizzo di una variabile.
Variabile puntatore
Int * y = & v;
VARIABILE |
POINTER |
Un valore memorizzato in un indirizzo di archiviazione / memoria con nome |
Una variabile che punta all’indirizzo di archiviazione / memoria di un’altra variabile |
Dichiarazione di un puntatore
Come le variabili, i puntatori in C progra mming devono essere dichiarati prima di poter essere utilizzati nel programma. I puntatori possono essere denominati come si desidera purché obbediscano alle regole di denominazione di C. Una dichiarazione di puntatore ha la seguente forma.
data_type * pointer_variable_name;
Qui,
- data_type è il tipo di base del puntatore dei tipi di variabili C e indica il tipo di variabile a cui punta il puntatore.
- L’asterisco (*: lo stesso asterisco utilizzato per la moltiplicazione) che è un operatore di riferimento indiretto, dichiara un puntatore.
Vediamo alcune dichiarazioni di puntatore valide in questo tutorial sui puntatori in C:
Inizializza un puntatore
Dopo aver dichiarato un puntatore, lo inizializziamo come variabili standard con un indirizzo variabile. Se i puntatori nella programmazione C non sono inizializzati e utilizzati nel programma, i risultati sono imprevedibili e potenzialmente disastrosi.
Per ottenere l’indirizzo di una variabile, usiamo l’operatore e commerciale (&), posto prima del nome di una variabile di cui abbiamo bisogno dell’indirizzo. L’inizializzazione del puntatore viene eseguita con la seguente sintassi.
Sintassi del puntatore
pointer = &variable;
Di seguito viene fornito un semplice programma per l’illustrazione del puntatore:
Risultato:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
Operatore | Significato |
* | Serve a 2 scopi
|
& | Serve solo 1 scopo
|
Tipi di puntatori in C
Di seguito sono riportati i diversi tipi di puntatori in C:
Puntatore nullo
Possiamo creare un puntatore nullo assegnando un valore nullo durante la dichiarazione del puntatore. Questo metodo è utile quando non si dispone di alcun indirizzo assegnato al puntatore. Un puntatore nullo contiene sempre il valore 0.
Il seguente programma illustra l’uso di un puntatore nullo:
#include <stdio.h>int main(){int *p = NULL; //null pointerprintf("The value inside variable p is:\n%x”,p);return 0;}
Risultato:
The value inside variable p is:0
Puntatore vuoto
Nella programmazione C, un puntatore vuoto viene anche chiamato come puntatore generico. Non ha alcun tipo di dati standard. Un puntatore void viene creato utilizzando la parola chiave void. Può essere utilizzato per memorizzare un indirizzo di qualsiasi variabile.
Il seguente programma illustra l’uso di un puntatore void:
#include <stdio.h>int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
Risultato:
The size of pointer is:4
Puntatore jolly
Un puntatore si dice che sia un puntatore jolly se non viene inizializzato a nulla. Questi tipi di puntatori C non sono efficienti perché potrebbero puntare a una posizione di memoria sconosciuta che potrebbe causare problemi nel nostro programma e potrebbe portare al blocco del programma. Si dovrebbe sempre stare attenti quando si lavora con i puntatori selvaggi.
Il seguente programma illustra l’uso del puntatore jolly:
#include <stdio.h>int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
Risultato
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
Altri tipi di puntatori in “c” sono i seguenti:
- Puntatore penzolante
- Puntatore complesso
- Puntatore vicino
- Puntatore lontano
- Puntatore enorme
Puntatori di accesso diretto e indiretto
In C, ci sono due modi equivalenti per accedere e manipolare un contenuto variabile
- Accesso diretto: usiamo direttamente il nome della variabile
- Accesso indiretto: usiamo un puntatore alla variabile
Comprendiamolo con l’aiuto del programma sottostante
Dopo aver compilato il programma senza errori, il risultato è:
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Aritmetica del puntatore in C
Le operazioni del puntatore sono riassunte nella figura seguente
Operazione prioritaria (precedenza)
Quando si lavora con i puntatori C, dobbiamo osservare le seguenti regole di priorità:
Se un puntatore P punta a una variabile X, allora * P può essere usato ovunque sia possibile scrivere X.
Le seguenti espressioni sono equivalenti:
In quest’ultimo caso, sono necessarie le parentesi: poiché gli operatori unari * e ++ sono valutati da destra a sinistra, senza le parentesi il puntatore P verrebbe incrementato, non l’oggetto su cui punta P.
La tabella sottostante mostra le operazioni aritmetiche e di base che possono essere utilizzate quando si ha a che fare con i puntatori C
Operazione | Spiegazione |
Assegnazione | int * P1, * P2 P1 = P2; P1 e P2 puntano alla stessa variabile intera |
Incremento e decremento | Int * P1; P1 ++; P1–; |
Aggiunta di un offset (costante) | Ciò consente al puntatore di spostare N elementi in una tabella. Il puntatore verrà aumentato o diminuito di N volte il numero di byte del tipo di variabile. P1 + 5; |
Puntatori C & Array con esempi
Tradizionalmente, noi accedere agli elementi dell’array usando il suo indice, ma questo metodo può essere eliminato usando i puntatori. I puntatori facilitano l’accesso a ogni elemento dell’array.
Risultato
12345
L’aggiunta di un particolare numero a un puntatore sposterà la posizione del puntatore sul valore ottenuto da un’operazione di addizione. Supponiamo che p sia un puntatore che attualmente punta alla posizione di memoria 0 se eseguiamo la seguente operazione di addizione, p + 1, verrà eseguito in questo modo:
Poiché p attualmente punta alla posizione 0 dopo aver aggiunto 1, il valore diventerà 1, e quindi il puntatore punterà alla posizione di memoria 1.
C Puntatori e stringhe con esempi
Una stringa è un array di oggetti char, che termina con un carattere nullo “\ 0”. Possiamo manipolare le stringhe usando i puntatori. Questo puntatore nell’esempio C spiega questa sezione
Risultato
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!
Un altro modo per trattare le stringhe è con un array di puntatori come nel seguente programma:
Risultato:
Please remember these materials:ironcoppergold
Vantaggi dei puntatori in C
- I puntatori sono utili per l’accesso posizioni di memoria.
- I puntatori forniscono un modo efficiente per accedere agli elementi di una struttura di array.
- I puntatori vengono utilizzati per l’allocazione dinamica della memoria e per la deallocazione.
- I puntatori vengono utilizzati per formare strutture di dati complesse come elenchi collegati, grafici, alberi, ecc.
Svantaggi dei puntatori in C
- I puntatori sono un po ‘complessi per capire.
- I puntatori possono portare a vari errori come errori di segmentazione o possono accedere a una posizione di memoria che non è affatto richiesta.
- Se un valore errato viene fornito a un puntatore, può causare il danneggiamento della memoria.
- I puntatori sono anche responsabili della perdita di memoria.
- I puntatori sono relativamente più lenti di quello delle variabili.
- I programmatori trovano molto difficile lavorare con i puntatori; quindi è responsabilità del programmatore manipolare un puntatore con attenzione.
Riepilogo
- Un puntatore non è altro che una posizione di memoria in cui sono memorizzati i dati.
- Un puntatore viene utilizzato per accedere alla posizione di memoria.
- Esistono vari tipi di puntatori come un puntatore nullo, un puntatore jolly, un puntatore void e altri tipi di puntatori.
- I puntatori possono essere usati con array e stringhe per accedere agli elementi in modo più efficiente.
- Possiamo creare puntatori a funzione per invocare una funzione dinamicamente.
- Le operazioni aritmetiche possono essere eseguite su un puntatore noto come puntatore aritmetico.
- I puntatori possono anche puntare a funzioni che facilitano il richiamo di funzioni diverse nel caso di definizione di un array di puntatori.
- Quando si desidera trattare diversi tipi di dati variabili, è possibile usa un puntatore vuoto typecast.