Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
TUTORATO di LINGUAGGI 1
dott. Enrico Vianello
PROGRAMMA
RIPASSO linguaggio C PUNTATORI
STRINGHE INPUT/OUTPUT
STRUTTURE DATI FILE
LISTE
TABELLE HASH ALBERI
STACK
AD & ADT
esercizi in preparazione allo scritto
correzione esercizio d’esame
I PUNTATORI
nel linguaggio C
lezione #1
PREMESSA
VARIABILI E INDIRIZZI
int var 1
&var 2
3 var
4
PUNTATORE
int var 1
&var 2
3 var
4
• Sintassi:
int *p;
SIGNIFICATO
int *p &p
1
2
3 p
4
DEFERENZIAZIONE
int *p;
VALORIZZAZIONE DI UN PUNTATORE
VALORIZZAZIONE DI UN PUNTATORE
&x 1 5 x
int x;
int *p; &p 2
x=5; 3 1 p
p=&x; /* *p vale 5 */ 4
malloc()
QUANDO SI USA?
La variabile puntatore è utile:
– Per il passaggio dei parametri tra sottoprogrammi
– Nella gestione delle strutture dati dinamiche (liste, alberi)
dati_anagrafici *p;
• oppure
p->data_di_nascita.giorno
p->cognome[0]
EFFETTI COLLATERALI
• Quando due puntatori puntano alla stessa cella di memoria
possiamo avere una modifica non voluta della variabili puntate:
int *p,*q;
int x,y;
p=&x;
q=&y;
temp = x;
x = y;
y = temp;
}
• la chiamata scambia(a,b) , con a e b variabili intere
correttamente inizializzate, funziona?
temp = x;
x = y;
y = temp;
}
• la chiamata scambia(a,b) , con a e b variabili intere
correttamente inizializzate, funziona?
temp = *px;
*px = *py;
*py = temp;
}
temp = *px; a:
*px = *py;
*py = temp; b:
}
px:
py:
temp = px;
px = py;
py = temp;
}
temp = px; a:
px = py;
py = temp; b:
}
int vett[10];
int i;
int vett[10];
int *p;
ESERCIZIO 1
Dati i seguenti tipi complessi:
typedef struct { typedef struct {
char cognome[30]; int giorno,mese,anno;
char nome [30]; } Data;
Data data_di_nascita;
char codice_fiscale [16];
} dati_anagrafici;
E i seguenti vettori:
#define LUN_NOME 6
char nome[LUN_NOME] = {‘C’, ‘I’, ‘C’, ‘C’, ‘I’, ‘O’};
#define LUN_COGNOME 8
char cognome[LUN_COGNOME] = {‘G’, ‘R’, ‘A’, ‘Z’, ‘I’, ‘A’, ‘N’, ‘I’};
#define LUN_CODICEF 16
char codice[LUN_CODICEF] = {‘C’, ‘C’, ‘G’, ‘R’, ‘Z’, ‘N’, ‘8’, ‘1’, ‘C’,
‘0’, ‘1’, ‘O’, ‘A’, ‘5’, ‘P’, ‘E’};
ESERCIZIO 1
int main() {
int i;
dati_anagrafici *p;
p = (dati_anagrafici*)malloc(sizeof(dati_anagrafici));
for (i=0; i<LUN_NOME; i++)
p->nome[i] = nome[i];
for (i=0; i<LUN_COGNOME; i++)
p->cognome[i] = cognome[i];
for (i=0; i<LUN_CODICEF; i++)
p->codice_fiscale[i] = codice[i];
p->data_di_nascita.giorno = 3;
p->data_di_nascita.mese = 3;
p->data_di_nascita.anno = 1981;
return 0;
}
ESERCIZIO 2
Scrivere il codice della funzione:
ESERCIZIO 2
while (pos<size_i) {
if (isdigit(input[pos])) //oppure confrontiamo ASCII
*output = *output+1;
pos++;
}
}
RIASSUMENDO...
int **matrix2;
puntatore a puntatore (allocato solo un puntatore - 4byte)
int matrix3[TOTALE][TOTALE];
array di array - matrice (già completamente allocata, matrix3[i,j] accede a
una porzione di memoria valida)
ESERCIZIO 3
Scrivere il codice della funzione:
vtmp = (int*)malloc(size_i*sizeof(int));
while (i<(size_i-1)) {
j=0;
*(output+i) = *(input+i);
while (j<(size_i)) {
if ( (*(input+j)) < (*(input+i)) )
*(output+i) = *(input+j);
j++;
}
i++;
}
}