Programmazione · 11 min read · Oct 11, 2025

Imparare C/C++ Passo dopo Passo - Pagina 9

09. Passo dopo Passo C/C++ — Programmazione C - Puntatori

Puntatori

| | 1. Informazioni sulla Memoria

  1. Schema di Indirizzamento
  2. Come trovare l’indirizzo di una Variabile
  3. Puntatori
  4. Aritmetica dei Puntatori
  5. Puntatori e Array
  6. Puntatori e Stringhe
  7. Glossario |

1. Informazioni sulla Memoria

Il computer ha la caratteristica di memorizzare dati e manipolarli. La memorizzazione dei dati richiede un dispositivo di memorizzazione, che è comodo per memorizzare e recuperare dati rapidamente e accuratamente senza confusione. Comunemente, il computer deve compromettere con due metodi di memorizzazione.

| | |

SRAM Memoria Statica ad Accesso Casuale
DRAM Memoria Dinamica ad Accesso Casuale
EEPROM Memoria Programmabile Elettricamente Cancellabile

I chip di memoria possono memorizzare dati, istruzioni e risultati intermedi e finali. La memoria è organizzata in byte, ogni byte è in grado di memorizzare un carattere di informazione. Ogni byte di memoria ha un indirizzo o numero di posizione, che lo identifica in modo univoco. La dimensione della memoria è misurata in kilobyte (KB), megabyte (Mb), gigabyte o terabyte (TB).

RAM:
Il dispositivo di memoria è una posizione di memorizzazione per memorizzare informazioni.
La risorsa vitale del computer, la memoria, è allocata a ciascuna delle variabili dopo la loro dichiarazione nel programma C. Il tipo della variabile decide il numero di byte di memoria da allocare a ciascuna variabile.

| | |

2. Schema di Indirizzamento

| | |

L’immagine sopra ti dice le seguenti informazioni.

| | 1. La RAM è una memoria temporanea e una parte del computer.

  1. Può contenere il valore del programma.
  2. Ogni byte nella RAM è identificato con un numero positivo unico chiamato indirizzo.
  3. Gli indirizzi sono come numeri, proprio come lo sono per le case in una strada.
  4. Il numero inizia da 0 e aumenta da lì 1-2-3 e così via.
  5. Se abbiamo 640 KB di memoria, il massimo indirizzo è 655.359, per 1 MB di memoria è 1.048.575.
  6. Il nostro programma, quando viene caricato in memoria, occupa un certo intervallo di questi indirizzi.
  7. Ciò significa che ogni variabile e ogni funzione nel nostro programma inizia a un indirizzo particolare. |

3. Come trovare l’indirizzo di una Variabile

Nell’ultima sezione, il punto 8 dice che ogni variabile/funzione inizia a un indirizzo particolare. Gli indirizzi sono numeri positivi unici nel formato esadecimale.

Trovare l’indirizzo di una variabile è un compito semplice attraverso l’operatore & ( indirizzo di).

& ( indirizzo di ) - Può dirti l’indirizzo di una variabile / funzione nel programma corrente.

Il seguente programma dimostra come trovare l’indirizzo di una variabile ‘a’

| | / 58_address.c /
#include
int main()
{
int a = 10;

printf(“\n Valore di A è : %d”, a);
printf(“\n Indirizzo di A è : %d”, &a);
return 0;
} |

Sostituisci i valori del formato contrassegnato sopra con il seguente formato per ottenere il valore assoluto dell’indirizzo esadecimale.

0x%x

Es.

 printf("\nIndirizzo di A è     : 0x%x", &a);

Programma per trovare l’indirizzo della funzione ‘disp()’

| | / 59_address.c /
#include
void disp()
{
printf(“\nCiao”);
printf(“\nCome stai”);
printf(“\nTu”);
} int main()
{
disp();
printf(“\nIndirizzo di disp() : 0x%x”, &disp);
return 0;
} |

4. Puntatori

Secondo l’ultima sezione sappiamo come trovare e visualizzare l’indirizzo di una variabile/funzione.
Questa volta impariamo come memorizzare l’indirizzo di una variabile/funzione in un’altra variabile.

Nota: Le variabili possono contenere valori costanti.

| | Prova con il seguente: int a, b;
a = 5;            / Valido /
b = &a;           / Non valido / Prova di nuovo con il seguente: int a, b;
a = 5;            /
Valido /
b = &a;           /
Valido */ |

b = &a; corretto! Sì, le variabili (variabili generali) non possono contenere indirizzi. Ma le variabili precedute da ‘*’ (Variabili Puntatore) possono contenere sia valori costanti che indirizzi di altre variabili/funzioni.

Puntatore: Variabile che contiene valori di indirizzo.

| | Variabili (Generali)
La variabile generale esegue solo un’operazione per contenere valori costanti | Variabili puntatore (Variabili precedute da ‘*’)
Le variabili puntatore possono eseguire due operazioni per contenere valori costanti così come valori di indirizzo di altre variabili/funzioni |

Riferimento a / Puntatore a / Contenuto all’indirizzo (*)

int *ptr;

Per i non iniziati, questa è una sintassi piuttosto bizzarra. L’asterisco significa puntatore a. Quindi l’istruzione definisce la variabile ptr come un puntatore a int. Questo è un altro modo di dire che la variabile può contenere l’indirizzo di variabili intere.

| | Se lo chiamassimo, tipo puntatore potremmo scrivere la dichiarazione come.

puntatore   ptr;                 /*  non valido */
``` Il problema è che il compilatore deve sapere che tipo di variabile il puntatore punta.  |



|  | Dichiarazione di una variabile puntatore  
char *cptr;           /* Puntatore a carattere */  
int *iptr;            /* Puntatore a int */  
float *fptr;            /* Puntatore a float */  
struct emp *e;            /* Puntatore a dati astratti emp e */ |

#### Accesso alla variabile Puntata:

Ecco un modo speciale per accedere ai valori di una variabile utilizzando il suo indirizzo invece del suo nome.



|  | /* 60_addr.c */  
#include   
int main()  
{  
int var1 = 11; /* variabile var1 = 11 */  
int *ptr; /* Variabile ptr come puntatore a */  
  
ptr = &var; /* Contiene l'indirizzo di var in ptr */  
  
printf("Valore di var1 è %d", *ptr); /* Puntatore all'indirizzo di var1 */  
return 0;  
} |


|  | ![](/files/4f55092a-e6b6-422d-af47-d517ba51db5b.jpg) |


Se l'istruzione è printf ("%d", ptr); allora visualizza il valore di ptr, cioè l'indirizzo di var1, ma l'istruzione sopra può visualizzare il contenuto dell'indirizzo, che è stato memorizzato nella variabile ptr.

Programma per dimostrare l'uso di Address_Of e Pointer_To


|  | /* 61_ptrdemo.c */  
#include   
int main()  
{  
int a = 10, *p; /* Intero a e puntatore p */  
p = &a; /* Assegna l'indirizzo di a a p */  
  
printf("\nValore di A : %d", a); /* Contenuto di a */  
printf("\nIndirizzo di A : 0x%x", &a); /* Indirizzo di a */  
printf("\nValore di P : 0x%x", p); /* Contenuto di p */  
printf("\nIndirizzo di P : 0x%x", &p); /* Indirizzo di p */  
printf("\nContenuto all'indirizzo di a : %d", *p); /* Puntatore a &a */  
return 0;  
} |

#### 5. Aritmetica dei Puntatori

Tutte le variabili possono supportare operazioni aritmetiche, così come possiamo eseguire operazioni aritmetiche anche sui puntatori. Il linguaggio C/C++ può supportare 4 operazioni aritmetiche sui Puntatori, vale a dire.


|  | Operazione  
Addizione  
Sottrazione  
Incremento  
Decremento | Simbolo  
+  
-  
++  
-- |



Nota: La caratteristica principale dell'aritmetica dei puntatori è che gli operatori sopra sono in byte con riferimento al tipo della sua variabile.



|  | /* 62_ptr.c */  
/* Dimostrazione dell'aritmetica dei puntatori */  
#include   
int main()  
{  
int a, *p;  
a = 100;  
p = &a;  
(*p)++; /* Incrementa il puntatore a (contenuto all'indirizzo) di 1 */  
printf("%d", *p);  
return 0;  
} |
|  | Output  
101 |


Dimostrazione dell'aritmetica dei Puntatori, Incrementa il valore dell'indirizzo


|  | /* 63_ptr.c */  
/* Incrementa il valore dell'indirizzo di 1 */  
#include   
int main()  
{  
int a, *p;  
a = 100;  
p = &a;  
*p++; /* Incrementa il valore dell'indirizzo in p di 1 */  
printf("%d", *p);  
return 0;  
}  |
|  | Output  
Output imprevisto |


Il programma sopra illustra gli operatori aritmetici con riferimento sia all'incremento del valore che dell'indirizzo. p è una variabile puntatore e a è assegnato a 100, così come p è assegnato all'indirizzo di a.

Ora *p++ effettua l'incremento o in realtà salta la memoria di 2 byte per ottenere un nuovo indirizzo e il suo contenuto.  
Se è **(*p)++, allora il contenuto puntato da p** è 100 è incrementato, risultando in 101.

#### 6. Puntatori e Array

Nel linguaggio C/C++, i tipi di dati puntatori e array si somigliano. Gli elementi dell'array fanno riferimento così come la variabile puntatore, entrambi sono utilizzati per contenere l'indirizzo degli elementi di dati in memoria.


|  | char name[20];  
Oppure  
char *name ;  
  
char months[12][10];  
Oppure  
char **months; |


C'è una stretta associazione tra puntatori e array. Ecco una revisione sugli array.


|  | /* 64_ptrarr.c */  
#include   
int main()  
{  
int i, a[5] = { 56, 43, 78, 98, 12 };  
for( i = 0; i < 5; i++)  
printf("\n%d", a[i]);  
return 0;  
} |


C'è la possibilità di accedere agli elementi dell'array utilizzando la notazione dei puntatori.  
Trova l'output del seguente programma.


|  | /* 65_ptrarr.c */  
#include   
int main()  
{  
int i, a[5] = { 56, 43, 78, 98, 12 };  
for( i = 0; i < 5; i++)  
printf("\n%d", *(a+ i) );  
return 0;  
} |


Segui il programma successivo:


|  | /* 66_ptrarr.c */  
#include   
int main()  
{  
int i, a[ ] = { 56, 43, 78, 98, 12 }, *p;  
p = a;  
for( i = 0; i < 5; i++)  
printf("\n%d", *(p+ i) );  
return 0;  
} |


Ecco un approccio più semplice per stampare gli elementi del dato array (dimensione non richiesta).


|  | /* 67_ptrarr.c */  
#include   
int main()  
{  
int i, a[ ] = { 56, 43, 78, 98, 12 }, *p;  
p = a;  
while (*p)           /* o for(int i = 0; i<5; i++ ) */  
printf("\n%d", *p++);  
return 0;  
} |

#### 7. Puntatori e Stringhe

Una stringa è una collezione di caratteri, inclusi gli spazi. Questa volta discutiamo su come gestire le stringhe utilizzando i puntatori. Non ci sono più discussioni per creare confusione. Ecco il compito semplice per verificare sia il puntatore che l'array di stringhe.

C'è una sottile differenza tra stringhe e puntatori, segui il programma.


|  | /* 68_ptrstr.c */  
#include   
int main()  
{  
char str1[ ] = "Ti piacerebbe esplorare C.";  
char *str2 = "Ti piacerebbe esplorare C.";  
puts(str1);  
puts(str2);  
str1++; /* Espressione non valida */  
str2++; /* Espressione valida */  
puts(str2); /* stampa ou piacerebbe esplorare…… */  
return 0;  
} |


Stringhe come Argomenti di Funzione

Una variabile puntatore è più flessibile delle variabili array, ecco il programma per dimostrare e visualizzare una stringa con la notazione dei puntatori.


|  | /* 69_ptrarr.c */  
#include   
void disp(char *p);  
int main()  
{  
char str[ ] = "Ciao!!..Ciao!!.. I puntatori possono gestirlo?";  
disp(str);  
return 0;  
} void disp(char *p)  
{  
while(*p)  
printf("%c", *p++);  
} |


Array di puntatori a stringhe

C'è uno svantaggio nel memorizzare un array di stringhe, in quanto i sotto-array che contengono la stringa devono avere tutti la stessa lunghezza. Così che lo spazio viene sprecato quando le stringhe sono più corte dei sotto-array.  
Ecco la soluzione:


|  | /* 70_strings.c */  
#include   
int main()  
{  
char *weeks[7 ] = { "Domenica", "Lunedì", "Martedì", "Mercoledì",  
"Giovedì", "Venerdì", "Sabato" };  
int i;  
for( i = 0; i<7; i++)  
puts(weeks[ i ] );  
return 0;  
} |


Quando le stringhe non fanno parte di un array, C/C++ le colloca contiguamente in memoria, quindi non ci sono spazi sprecati.  
**/* Un programma di esempio per contenere un array di puntatori di tipo ‘int’ */**


|  | /* 71_ptrarr.c */  
#include   
int main()  
{  
int *arr[4]; /* Array di puntatori a int */  
int i = 31, j = 5, k = 19, l = 71, m;  
  
arr[0] = &i;  
arr[1] = &j;  
arr[2] = &k;  
arr[3] = &l;  
  
for(m = 0; m <= 3; m++)  
printf("\n%d", *(arr[m]) );  
return 0;  
} |


Uno sguardo alle Funzioni della Libreria

Siamo già familiari con le funzioni standard delle stringhe. Hanno argomenti stringa che sono specificati utilizzando la notazione dei puntatori,  
Se siamo chiari con i concetti di puntatori e stringhe, siamo in grado di scrivere le nostre funzioni per le stringhe.  
Ecco un programma di esempio per copiare una stringa.  
  
**/* Copia una stringa in un'altra con i puntatori */**


|  | /* 72_strcpy1.c */  
#include   
void strcpy1(char * dest, char *src);  
  
int main()  
{  
char *str1 = "Come posso imparare di più su C/C++ !!!";  
char *str2;  
strcpy1(str2, str1);  
puts(str2);  
return 0;  
} void strcpy1(char * dest, char *src)  
{  
while(*src)  
*dest++ = *src++;  
*dest = '\0';  
} |


#### 8. Glossario


| Indirizzo | Un valore che punta a una posizione in memoria. Un puntatore contiene l'indirizzo o la posizione di un valore, a differenza del valore stesso. |
| Array | Un array è una collezione di elementi di dati dello stesso tipo. |
| Contiguo | Una caratteristica di memorizzazione che specifica che i valori sono memorizzati in posizioni consecutive sia in memoria che su disco. |
| Funzione | Una serie di istruzioni per eseguire un compito specifico, che può essere combinato con altre funzioni per creare un programma. |
| Memoria | Descrittiva di un dispositivo o mezzo che può accettare dati, contenerli e fornirli su richiesta in un secondo momento. Sinonimo di memorizzazione. |
| Puntatore | Contiene l'indirizzo o la posizione di memoria di un valore, a differenza del valore stesso. |
| RAM | (Memoria ad Accesso Casuale) 1. Un dispositivo di memorizzazione strutturato in modo tale che il tempo necessario per recuperare i dati non è significativamente influenzato dalla posizione fisica dei dati.  2. La *sezione di memorizzazione primaria* di un computer personale. |
| Stringa | Un array capace di memorizzare zero o più caratteri. In C, una stringa è dichiarata come un array di caratteri con il carattere NULL (\0) aggiunto per specificare la fine della stringa. |
| Variabile | Un nome associato a una posizione in memoria il cui valore può cambiare durante l'esecuzione del programma. |
Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.