Vai al contenuto
Appunti di InformaticaUniTo · 2026/27

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.

Lezioni
Lab01 lun 05/10 (B2) e mar 06/10 (B1) · 02B mar 06/10 · 02C mer 07/10
Tempo di ripasso
40 minuti
  • 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 programma e si esegue con ./programma. Con -Werror basta 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 main stanno 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 di x. scanf("%d", &x) scrive all'indirizzo di x e restituisce quanti valori ha letto.
  • Un puntatore int* p = &x; contiene un indirizzo; *p è la variabile puntata. Mai *p con p non inizializzato o NULL.
§1

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 e C:\ su Windows. Un percorso relativo parte dalla cartella in cui sei. . è la cartella attuale, .. quella che la contiene.
  • command not found vuol dire che il nome è sbagliato, o che il programma non è in una cartella del PATH.
Che cosa fareLinux e macOSWindows
dove sonopwdcd
che cosa c'èlsdir
cambiare cartellacd nomecd nome
creare una cartellamkdir nomemkdir nome
copiare, spostarecp, mvcopy, move
cancellarermdel
leggere un filecattype

Metodo · Dal file al programma

  1. Scrivi il sorgente con un editor semplice, senza completamento automatico, come all'esame.
  2. gcc -Wall -Werror buongiorno.c -o buongiorno: se gcc non scrive niente, il programma è compilato.
  3. ./buongiorno su Linux e macOS, buongiorno su Windows.
  4. 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

  • rm e del non usano il cestino.
  • All'esame CodeRunner compila con -Wall -Werror e confronta le stampe carattere per carattere.
§2

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.

TipoByte di solitoSpecificatore in printf
char1%c
int4%d
long8 su Linux, 4 su Windows%ld
float4%f
double8%f
size_t8%zu

Metodo · Lo stato della memoria

  1. 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.
  2. Una variabile dichiarata e non assegnata contiene «?».
  3. 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 / 3 fa 4, 13 % 3 fa 1. Ordine: parentesi, poi *, /, %, poi +, -, da sinistra a destra, e l'assegnamento per ultimo.
  • x += 3 vuol dire x = x + 3; x++ aggiunge 1.
  • Un int troppo grande gira (overflow), un reale messo in un int perde 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.
§3

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 di x; 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: con 12.9 legge 12 e si ferma al punto; con ciao restituisce 0 e non tocca x.
ScritturaChe cos'èCon int x = 5; int* p = &x;
xil valore5
&xl'indirizzo di xper esempio 0x03FC
pun puntatore: contiene un indirizzolo stesso indirizzo di x
*pla variabile all'indirizzo contenuto in pè x: vale 5
*p = 8;scrive nella variabile puntataora x vale 8
50x03FCxpindirizzo 0x03FC*p
Dopo 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 «?»; NULL vuol 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

  • scanf vuole l'indirizzo, printf il valore.
  • *p si usa solo se p contiene l'indirizzo di una variabile vera.
§4

Verso l'esame

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.
§5

Domande di ripasso

autoverifica

Rispondi a voce alta o per iscritto, poi apri la risposta.

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.

§6

Quiz d'esame

come all'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.

  1. Moodle 2023/24, esercizio «Corr. Ass. 1». Il programma esegue r = r + 2; e poi r = r * 3;. Alla fine deve valere 33 <= r && r <= 39. Per quali valori interi iniziali di r succede?
  2. Variante dello stesso esercizio vista negli appelli. Con le stesse istruzioni, r = r + 2; e r = r * 3;, alla fine deve valere r == 33. Che cosa deve valere r all'inizio?
  3. Sul modello di «Corr. Ass. 1». Con le stesse istruzioni, alla fine deve valere 34 <= r. Da quale valore iniziale intero di r in su funziona?
  4. 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 valgono x e y?
  5. Sul modello degli errori che fanno fallire i test. Con int a = 7, b = 2; double m = a / b;, che cosa stampa printf("%f", m);?
  6. Sul modello della lettura con scanf. Con int a = 0, b = -1; e l'input 12.9, che cosa restituisce scanf("%d %d", &a, &b) e che cosa c'è in a e b?