Riassunto settimanale · Programmazione I · Canale B · 05/10 – 09/10/2026
Settimana 2: il laboratorio, le variabili in memoria, gli indirizzi e i puntatori
Il laboratorio e le due lezioni della settimana in poche pagine: i comandi da sapere, il modello della memoria che serve negli esercizi d'esame, la differenza tra valore e indirizzo, e le domande per controllarti.
- Definizione o risultato da sapere
- Trappola / errore tipico
- Conta all'esame
- Oltre le slide
- L'idea e il metodo, passo per passo
- Da ricordare
La settimana in 7 punti
- Al laboratorio si lavora dalla riga di comando: si scrive un ordine, si preme Invio, si legge la risposta. Un comando ha nome, opzioni e argomenti.
- Si compila con
gcc -Wall -Werror sorgente.c -o programmae si esegue con./programma. Con-Werrorbasta un avviso per fermare tutto, come all'esame. - Una variabile ha nome, tipo, indirizzo e valore. Dichiarata e non assegnata, contiene un valore indeterminato, «?».
- Nel modello della memoria le variabili di
mainstanno sullo stack, in ordine di dichiarazione, tra FP e SP. L'assegnamento calcola la destra e copia il valore a sinistra. - Tra interi
/taglia la parte dopo la virgola e%dà il resto.*,/,%vengono prima di+e-. &xè l'indirizzo dix.scanf("%d", &x)scrive all'indirizzo dixe restituisce quanti valori ha letto.- Un puntatore
int* p = &x;contiene un indirizzo;*pè la variabile puntata. Mai*pconpnon inizializzato oNULL.
Lab01 · Riga di comando e gcc (lun 05/10, mar 06/10)
Il laboratorio sono 10 incontri da 3 ore al laboratorio Turing, dalle 14 alle 17: turno B2 (matricola pari) il lunedì con Elisa Marengo, turno B1 (matricola dispari) il martedì con Valerio Basile. Quando esci dal PC del laboratorio i file vengono cancellati: salvali prima.
- Un percorso assoluto parte dalla radice,
/su Linux eC:\su Windows. Un percorso relativo parte dalla cartella in cui sei..è la cartella attuale,..quella che la contiene. command not foundvuol dire che il nome è sbagliato, o che il programma non è in una cartella del PATH.
| Che cosa fare | Linux e macOS | Windows |
|---|---|---|
| dove sono | pwd | cd |
| che cosa c'è | ls | dir |
| cambiare cartella | cd nome | cd nome |
| creare una cartella | mkdir nome | mkdir nome |
| copiare, spostare | cp, mv | copy, move |
| cancellare | rm | del |
| leggere un file | cat | type |
Metodo · Dal file al programma
- Scrivi il sorgente con un editor semplice, senza completamento automatico, come all'esame.
gcc -Wall -Werror buongiorno.c -o buongiorno: se gcc non scrive niente, il programma è compilato../buongiornosu Linux e macOS,buongiornosu Windows.- Per provare un programma che legge un numero senza scriverlo a mano:
echo 7 | ./programma.
Prova tu
Sei nella cartella /home/anna/prog1. Dove ti porta cd ..? E che percorso assoluto ha il file lab01/buongiorno.c?
cd .. porta a /home/anna, la cartella che contiene prog1. Il file è /home/anna/prog1/lab01/buongiorno.c.
Da ricordare
rmedelnon usano il cestino.- All'esame CodeRunner compila con
-Wall -Werrore confronta le stampe carattere per carattere.
02B · Memoria, assegnamento, espressioni (mar 06/10)
Un tipo dice come leggere i bit: quanti byte, quali valori, quali operazioni. I tipi del C sono finiti: un int va da circa −2,1 a +2,1 miliardi, un float ha circa 7 cifre giuste.
| Tipo | Byte di solito | Specificatore in printf |
|---|---|---|
char | 1 | %c |
int | 4 | %d |
long | 8 su Linux, 4 su Windows | %ld |
float | 4 | %f |
double | 8 | %f |
size_t | 8 | %zu |
Metodo · Lo stato della memoria
- Una riga per variabile, nell'ordine di dichiarazione: la prima sotto FP, ognuna 4 byte più in basso per gli
int. SP indica la prossima casella libera. - Una variabile dichiarata e non assegnata contiene «?».
- A ogni assegnamento si calcola la destra con i valori di quel momento, poi si scrive il risultato nella casella a sinistra, cancellando il valore di prima.
- Tra interi:
13 / 3fa 4,13 % 3fa 1. Ordine: parentesi, poi*,/,%, poi+,-, da sinistra a destra, e l'assegnamento per ultimo. x += 3vuol direx = x + 3;x++aggiunge 1.- Un
inttroppo grande gira (overflow), un reale messo in unintperde la parte dopo la virgola: gcc non avvisa.
Prova tu
Dopo int a = 4; int b; b = a * 3 % 5; a = a + b; quanto valgono a e b?
a * 3 fa 12, 12 % 5 fa 2: b vale 2. Poi a = 4 + 2 = 6.
Da ricordare
- Variabile = nome + tipo + indirizzo + valore.
printf: uno specificatore per ogni valore, nell'ordine e del tipo giusto.
02C · Indirizzi, scanf e puntatori (mer 07/10)
Ogni variabile ha un valore, che cosa c'è dentro, e un indirizzo, dove sta: come una casa ha un inquilino e un numero civico.
&xè l'indirizzo dix; si stampa con%p, e cambia da un'esecuzione all'altra.scanf("%d", &x);riceve l'indirizzo perché deve sapere dove scrivere. Restituisce quanti valori ha letto: con12.9legge 12 e si ferma al punto; conciaorestituisce 0 e non toccax.
| Scrittura | Che cos'è | Con int x = 5; int* p = &x; |
|---|---|---|
x | il valore | 5 |
&x | l'indirizzo di x | per esempio 0x03FC |
p | un puntatore: contiene un indirizzo | lo stesso indirizzo di x |
*p | la variabile all'indirizzo contenuto in p | è x: vale 5 |
*p = 8; | scrive nella variabile puntata | ora x vale 8 |
int x = 5; int* p = &x; la casella di p contiene l'indirizzo di x, qui 0x03FC. *p vuol dire «la casella a quell'indirizzo»: *p = 8; cambia x, non p.- Due puntatori con lo stesso indirizzo sono alias: scrivere con uno cambia la variabile per tutti.
- Un puntatore non inizializzato contiene «?»;
NULLvuol dire «non punta a niente». Su tutti e due non si usa*. - Ogni puntatore occupa 8 byte su 64 bit, qualunque sia il tipo puntato.
&e*si annullano:*&xèx.
Trappola · I tipi dei puntatori
int* e float* non si mescolano: con gcc 16.1 mettere &x di un int in un float* è un errore, anche senza opzioni. Nelle slide è ancora un avviso.
Prova tu
Dopo int a = 1, b = 2; int* p = &a; int* q = &b; *p = *q; q = p; *q = 7; quanto valgono a e b?
*p = *q copia 2 in a. q = p fa puntare q ad a. *q = 7 scrive 7 in a. Alla fine a vale 7 e b vale 2.
Da ricordare
scanfvuole l'indirizzo,printfil valore.*psi usa solo sepcontiene l'indirizzo di una variabile vera.
Verso l'esame
- Stato della memoria: è il tipo di esercizio che parte da queste lezioni. Una riga per variabile, i valori aggiornati a ogni assegnamento, gli indirizzi nelle caselle dei puntatori.
- CodeRunner confronta le stampe: niente indirizzi stampati, niente specificatori sbagliati, niente variabili inutilizzate con
-Werror. - Appelli 2026/27: lunedì 25/01/2027 e giovedì 11/02/2027, alle 9:00.
- Da fare adesso: rifai gli esercizi del Lab01 dalla riga di comando, e disegna lo stato della memoria del programma con i puntatori della 02C.
Domande di ripasso
Che differenza c'è tra un percorso assoluto e uno relativo?
Il percorso assoluto parte dalla radice del disco e funziona da qualunque cartella. Quello relativo parte dalla cartella in cui ti trovi.
Che cosa fanno le opzioni -Wall e -Werror di gcc?
-Wall mostra gli avvisi, -Werror li trasforma in errori: basta un avviso perché il programma non venga compilato.
Quali sono le quattro cose che ha una variabile?
Nome, tipo, indirizzo e valore.
Quanto valgono 17 / 5 e 17 % 5 in C?
3 e 2.
Perché in scanf serve la &?
Perché scanf deve sapere dove scrivere il valore letto: le serve l'indirizzo della variabile, non il suo valore.
Che cosa restituisce scanf?
Il numero di valori letti con successo. Se il primo valore non va bene, restituisce 0.
Con int x = 3; int* p = &x; *p = *p + 1; quanto vale x?
4: *p è x, quindi l'assegnamento aggiunge 1 a x.
Perché non si può usare *p se p vale NULL?
Perché NULL non è l'indirizzo di nessuna variabile: non c'è niente da leggere o da scrivere.
Quiz d'esame
L'esame di Programmazione I non ha domande a crocette. Ha due esercizi di teoria su CodeRunner, «correttezza di una sequenza di assegnazioni» e «stato della memoria», e tre di programmazione. Le prime due domande sono l'esercizio vero di correttezza della pagina Moodle 2023/24 («Corr. Ass. 1») e una sua variante vista negli appelli: si risolvono con gli assegnamenti di questa settimana. Le altre sono sul modello dell'esercizio sullo stato della memoria e degli errori che fanno fallire i test. Ho provato tutto con gcc.
- Moodle 2023/24, esercizio «Corr. Ass. 1». Il programma esegue
r = r + 2;e poir = r * 3;. Alla fine deve valere33 <= r && r <= 39. Per quali valori interi iniziali dirsuccede?Si ragiona all'indietro, dall'ultima istruzione: prima dir = r * 3serve , cioè ; prima dir = r + 2serve , cioè . Controllo: 9 diventa 33, 11 diventa 39. La risposta più insidiosa è11 <= r && r <= 13: si ferma a metà strada.11 <= r && r <= 12applica le istruzioni nell'ordine sbagliato. Nella pagina Moodle la stessa condizione era scritta come33 <= (r+2)*3 && r <= 11. - Variante dello stesso esercizio vista negli appelli. Con le stesse istruzioni,
r = r + 2;er = r * 3;, alla fine deve valerer == 33. Che cosa deve valererall'inizio?All'indietro: dà , e dà . Controllo: . La risposta più insidiosa èr == 11: è il valore a metà, dopor = r + 2. - Sul modello di «Corr. Ass. 1». Con le stesse istruzioni, alla fine deve valere
34 <= r. Da quale valore iniziale intero dirin su funziona?Serve . Tra gli interi, non basta e sì: quindi , cioè . La risposta più insidiosa è 9: andrebbe bene con 33, non con 34. Negli interi si arrotonda per eccesso quando si divide un «almeno»: è la trappola segnalata nelle soluzioni. - Sul modello dell'esercizio sullo stato della memoria. Dopo
int x = 5, y = 8; int *p = &x; *p = *p + y; p = &y; *p = x - 1;quanto valgonoxey?*p = *p + yscrive inx, perchépcontiene l'indirizzo dix: . Poip = &ysposta il puntatore, e*p = x - 1scrive iny: . La risposta più insidiosa èx = 13,y = 4: usa il vecchio valore dixnell'ultima riga. Ricorda: a destra si usano i valori di quel momento. - Sul modello degli errori che fanno fallire i test. Con
int a = 7, b = 2; double m = a / b;, che cosa stampaprintf("%f", m);?a / bè una divisione tra interi e fa 3; solo dopo il 3 diventa3.000000. Per avere 3,5 serve(double)a / b. La risposta più insidiosa è3.500000: è il risultato «giusto» a mano, ma il C fa prima la divisione intera. - Sul modello della lettura con
scanf. Conint a = 0, b = -1;e l'input12.9, che cosa restituiscescanf("%d %d", &a, &b)e che cosa c'è inaeb?scanflegge 12 e si ferma al punto, che non può far parte di un intero. Per il secondo%dtrova.9e si arrende: ha letto un solo valore, ebnon viene toccata. La risposta più insidiosa è «2,a = 12,b = 9»: il punto non è uno spazio, quindi il 9 non viene letto. Con13si arrotonderebbe, mascanfnon arrotonda mai.