Puntatori C · 3 min read · Nov 20, 2025

Linux C Programming tutorial Parte 21: Puntatori di caratteri, array di puntatori e puntatore a puntatore

Il concetto di puntatori è davvero uno dei concetti molto importanti nel linguaggio di programmazione C. Fino ad ora, abbiamo discusso diversi aspetti dei puntatori in C. Espandendo su questo, in questo tutorial discuteremo alcuni altri concetti sui puntatori.

Puntatori di caratteri, array di puntatori e puntatore a puntatore in C

Iniziamo con i puntatori di caratteri con le seguenti righe di codice:

char p[] = "Mi piace HowtoForge"  
char *p = "Mi piace HowToForge"

La prima riga definisce un array ‘p’ con dimensione uguale al numero di caratteri tra virgolette. Ma la riga successiva definisce un puntatore ‘p’ che punta a una costante di stringa.

La differenza qui è che il primo ‘p’, essendo un array, puoi facilmente modificare o cambiare i contenuti dell’array. Ma poiché il secondo ‘p’ punta a una costante di stringa, non puoi semplicemente cambiare i contenuti della stringa.

Ad esempio, il seguente pezzo di codice cerca di modificare una costante di stringa:

#include   
  
int main()  
{  
   char *p = "Mi piace HowToForge";  
   
   p[0] = 'U';  
   
   return 0;  
}

Ecco l’output prodotto da questo codice sul mio sistema:

Errore di segmentazione

Questo errore suggerisce che l’esecuzione del programma è terminata bruscamente, e ciò è dovuto al fatto che abbiamo cercato di cambiare qualcosa che è costante.

Inoltre, tieni presente che mentre il puntatore ‘p’ può essere fatto puntare a una stringa diversa, non puoi cambiare l’indirizzo base dell’array ‘p’ (se ricordi, di questo ne abbiamo già discusso in uno dei nostri tutorial precedenti).

Ora passando agli array di puntatori, proprio come hai visto array di interi, caratteri e altri tipi, ci può anche essere un array di puntatori. Ad esempio, il seguente programma definisce un array ‘arr’ di puntatori a interi e assegna valori ad esso.

#include   
  
int main()  
{  
 int *arr[3];  
 int a = 0, b = 1, c = 2;  
   
 arr[0] = &a;  
 arr[1] = &b;  
 arr[2] = &c;  
  
 return 0;  
}

Nota che i valori assegnati all’array sono indirizzi. Questo perché ‘arr’ è un array di puntatori, e i puntatori non memorizzano altro che indirizzi. Ora, se vuoi accedere ai valori conservati a questi indirizzi, dovrai usare l’operatore *.

Il seguente esempio (che non è altro che un’estensione dell’esempio precedente) mostra questo:

#include   
  
int main()  
{  
   int *arr[3];  
   int a = 0, b = 1, c = 2;  
   
   arr[0] = &a;  
   arr[1] = &b;  
   arr[2] = &c;  
   
   for(int i=0; i < 3; i++)  
      printf("\n arr[%d] è: %d",i,*(arr[i]));  
  
 return 0;  
}

Ecco l’output:

arr[0] è: 0   
arr[1] è: 1   
arr[2] è: 2 

Simile agli array di puntatori a interi (come quello di cui abbiamo discusso qui), puoi avere array che memorizzano puntatori a caratteri e altro.

Ora, passiamo ai puntatori a puntatori. Come abbiamo ripetuto un certo numero di volte finora, un puntatore memorizza un indirizzo. Ora, fino ad ora in questa serie di tutorial di programmazione C, abbiamo solo visto un puntatore puntare a una variabile non puntatore, ma il fatto è che i puntatori possono puntare anche ad altri puntatori.

Questo significa che un puntatore può memorizzare un indirizzo di un altro puntatore. Ad esempio, il seguente è un doppio puntatore o un puntatore a puntatore:

int **ptr;

Ecco un pezzo di codice che utilizza un doppio puntatore:

#include   
  
int main()  
{  
   int *ptr;  
   int p;  
   
   int a = 10;  
   
   ptr = &a;  
   
   p = &ptr;  
   
   printf("\n Il puntatore 'p' punta al puntatore 'ptr' che punta ulteriormente al valore: %d", p);  
   
   return 0;  
}

Ecco l’output:

Il puntatore 'p' punta al puntatore 'ptr' che punta ulteriormente al valore: 10

Quindi questo è stato un esempio di un doppio puntatore. Su linee simili, puoi avere un puntatore a un puntatore a un puntatore, definito come, ad esempio, int *ptr. Il numero massimo di tali livelli ‘puntatore a puntatore a……’ è specifico per l’implementazione (in alcuni casi il limite è 12 però).

Praticamente, tuttavia, è probabile che tu incontri solo puntatori a puntatori fino al livello tre, poiché avere più livelli rende la logica più complessa da comprendere e mantenere.

Conclusione

Abbiamo discusso qui tre concetti importanti relativi ai puntatori. Ti consigliamo di provare gli esempi e i concetti che abbiamo discusso qui sul tuo sistema per avere un’idea migliore di come funzionano queste cose. In caso di dubbi o domande, lasciaci un commento qui sotto.

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.