Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1
19/02/2019
• Se arr_ptr punta ad un particolare elemento di un vettore, • Esiste una differenza sostanziale tra puntatore ed
allora arr_ptr+1 punterà all’elemento successivo del array:
vettore, arr_ptr-1 a quello precedente ed arr_ptr+i allo i- • il puntatore è comunque una variabile, mentre il nome di
esimo elemento successivo un array è una costante e riferisce una collezione di
oggetti di ugual tipo
• Il valore di una variabile di tipo array è, per definizione,
l’indirizzo dell’elemento zero dell'array stesso, per cui: • Ciò comporta che espressioni del tipo:
• arr_ptr = &arr[0] equivale a arr_ptr = arr • arr_ptr = arr ed arr_ptr++ sono legali, mentre
espressioni del tipo:
• È possibile riferire l’elemento i-esimo di un array a[i] nella arr = arr_ptr ed arr++ sono illegali !!
seguente forma: • Il nome di un array non può mai figurare alla sinistra di
un'assegnazione
*(a + i)
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 5 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 6
• Sui puntatori sono lecite le seguenti operazioni: • Assegnamento di un puntatore con lo zero
• int *ptr1;
• assegnamento tra puntatori dello stesso tipo • ptr1 = 0; /*indica che ptr1 non punta a nulla */
• int *ptr1, *ptr2, val=1;
• ptr1 = &val;
• Confronto di un puntatore con lo zero
• int *ptr1;
• ptr2 = ptr1; /* ptr2 punta al valore 1 */ • ptr1 = 0;
• addizione e sottrazione tra puntatori ed interi • if (ptr1 == 0) printf(“Il puntatore non è inizializzato\n”);
• int *ptr, arr[10]; • Da notare che il C garantisce che lo zero non sia un
• ptr = &arr[0]; oppure ptr = arr; indirizzo valido per i dati, per cui il riferimento a zero si usa
• ptr = ptr + 4 /* punta al quinto elemento dell’array arr[4] */ spesso per indicare un puntatore non inizializzato
• ptr = ptr - 2 /* punta al terzo elemento dell’array arr[2] */ • spesso lo zero viene sostituito dalla costante simbolica NULL
definita nella libreria standard
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 7 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 8
2
19/02/2019
Esempi Esempi
• /* Dichiarazioni */ • /* azzera l’intero puntato da v_ptr */
• int v1, v2, *v_ptr; • *v_ptr = 0;
• /* moltiplica v2 per il valore puntato da v_ptr */ • /* incrementa di uno l’oggetto puntato da v_ptr */
• v1 = v2* (*v_ptr); • ++*v_ptr;
• /* somma v1, v2 e il contenuto di v_ptr */ • /* azzera l’intero puntato da v_ptr e incrementa il pointer
• v1 = v1+v2+ *v_ptr; di un intero */
• /* assegna a v2 il valore che si trova tre interi dopo v_ptr */ • *v_ptr++ = 0;
• v2 = *(v_ptr + 3); • /* incrementa il pointer e azzera l’intero puntato da v_ptr
*/
• /* incrementa di uno l’oggetto puntato da v_ptr*/
• (*v_ptr++) = 0;
• *v_ptr += 1;
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 11 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 12
3
19/02/2019
4
19/02/2019
Esempio Esempio
void swap(int *x_ptr, int *y_ptr) { /* Codice della funzione main */
int temp;
temp = *x_ptr; void main( ) {
*x_ptr = *y_ptr; const int N = 100;
*y_ptr = temp; char linea[N]; int numero;
}
printf(“Inserisci una linea di testo\n”);
main( ) { LeggiLinea(linea, N);
int a = 3; int b = 5;
ContaDigit(linea, &numero);
swap(&a, &b);
printf(“%d %d\n”, a, b); printf(“La linea %s contiene %d numerici”, linea, numero);
} }
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 19 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 20
5
19/02/2019
Esempio Esempio
/* Legge una linea in input */ /*Conta il numero di cifre numeriche*/
void LeggiLinea (char *s , int max) { void ContaDigit (char *s, int *times) {
char c; int i = 0; *times = 0;
while ((c=getchar())!=‘\n’ && (i<max-1)) {
for( ; *s != ‘\0’ ; s++)
(*s) = c; s++; i++;
if ((*s >= ‘0’) && (*s <= ‘9’))
}
*s = ‘\0’; (*times)++;
} }
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 21 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 22
6
19/02/2019
7
19/02/2019
• È possibile definire puntatori a funzioni • È possibile definire una variabile "puntatore a funzione"
• ciò che contraddistingue una funzione è la coppia di secondo la seguente sintassi:
parentesi tonde ( ) : func( ); • <return type> <(* name_ptr)> <(arg type, …)>
• le citazione del nome della funzione non seguite dalle • Ad esempio:
parentesi tonde viene interpretata dal compilatore come int (*function_ptr)(char *, float);
l’indirizzo della funzione • indica che function_ptr è un puntatore a funzione che
• Il puntatore ad una funzione può essere manipolato, ritorna un intero e che riceve due argomenti,
passato a funzioni ed inserito in un array rispettivamente di tipo char* e float
int abc(); • Poiché un puntatore a funzione è un oggetto che contiene
main() { l’indirizzo di una funzione, sarà possibile richiamare una
printf(“l’indirizzo di abc() è %u”, abc);
} funzione anche attraverso il suo riferimento a puntatore
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 31 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 32
8
19/02/2019
Esempio Dichiarazione
• Una volta conosciuto l’indirizzo di una funzione, la si può invocare • La dichiarazione "void (*abcpunt)( );" significa che abcpunt è
mediante il suo indirizzo una variabile puntatore ad una funzione che ritorna un void
• Esempio:
• Con l’assegnazione
void abc( ) {
abcpunt = abc;
printf (“A B C “);
} • si rende effettivo l’uso del puntatore
main( ) { • ATTENZIONE: L’uso delle parentesi è importante, in quanto
void (*abcpunt)( ); l’operatore * ha una precedenza inferiore alla coppia di
abcpunt = abc;
parentesi ()
abc( ); • La notazione
(*abcpunt)( ); void *abcpunt( );
} • per effetto della precedenza alle parentesi, porta alla
definizione di una funzione che restituisce un puntatore a void
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 33 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 34
Esempio Esempio
void main (int argc, char *argv[ ]) {
• Scrivere un programma "eleva" che riceve, tramite la int (*funz)(int); int i = 1;
eleva quadrato 4 cubo 3 qualsiasi 99
16 27 0
linea di comando, delle coppie <operazione, intero>, while (i<argc) {
dove operazione specifica il quadrato o il cubo, ed if (!strcmp(“quadrato”, argv[i]))
applica l’operazione all’intero; nel caso di errore funz = quadrato;
else if (!strcmp(“cubo”, argv[i]))
sull’operazione, il risultato è 0 funz = cubo;
else
int cubo(int x) { int quadrato(int x) { int nulla(int x) { funz = nulla;
return(x*x*x); return(x*x); return 0; printf(“%d ”, (*funz)(atoi(argv[i+1])));
} } } i += 2;
}
}
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 35 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 36
9
19/02/2019
strcmp( ) strcpy( )
• La funzione strcmp ha una intestazione del tipo: • L’intestazione di strcpy è la seguente:
• int strcmp(char *str1, char *str2); • char* strcpy(char *str1, char *str2);
• Le due stringhe passate come argomento vengono • La stringa puntata dal secondo parametro viene ricopiata,
confrontate carattere per carattere carattere per carattere, nello spazio di memoria della prima
• se sono uguali, il valore restituito è 0, altrimenti la funzione stringa, restituendo il puntatore alla nuova stringa
restituisce la differenza numerica tra i primi due caratteri • Esempio:
responsabili della differenza tic tac, drin drin a b c
main( ) {
• Esempio: char stringa[20];
0 3
main( ) { strcpy(stringa, “tic tac, drin drin”);
printf(“ %d\t ”, strcmp(“salve”,“salve”)); printf(“%s ”, stringa);
printf(“ %d ”, strcmp(“valve”,“salve”)); printf(“%s”, strcpy(stringa,“a b c”));
} }
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 39 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 40
10