Problema
Scrivere una funzione di tipo main
che effettui operazioni su vettori la cui lunghezza viene definita in ingresso del programma (allocazione dinamica dei vettori).
Allocazione dinamica
In C è possibile allocare spazio di memoria per un array durante l’esecuzione del programma. Non è dunque necessario stabilire la dimensione massima di un array all’atto della sua dichiarazione. Se ad esempio si dichiara:
int a[100];
si dice che abbiamo utilizzato una allocazione statica perché a run – time viene allocato uno spazio di 100 variabili di tipo int indipendentemente da quanto sarà la lunghezza del vettore a.
Con una istruzione del tipo:
int *a;
int n=3;
a=(int *)malloc(n*sizeof(int));
Il vettore viene allocato dinamicamente dal programma ed è un vettore di dimensione 3.
L’allocazione dinamica della memoria si realizza mediante le funzioni malloc e calloc definite nell’header file di sitema stdlib.h
L’istruzione:
char *malloc(size);
restituisce un puntatore a carattere che punta ad una are di memoria di lunghezza size in byte. Con tale istruzione lo spazio di memoria non è inizializzato.
L’istruzione:
char *calloc(n,size);
restituisce un puntatore a carattere che punta a n parole di lunghezza size in byte di memoria allocato. Le parole di memoria allocato vengono inizializzate a 0
Se la memoria richiesta non è disponibile, malloc
e calloc
restituiscono una costante NULL, che assume valore 0.
Per determinare il numero di byte necessari alla costruzione di un array di elementi di un fissato tipo si utilizza un operatore speciale sizeof.
L’operatore sizeof
restituisce la lunghezza in byte di un fissato tipo di dato
Esempio
float b; ..
Per conoscere la lunghezza in byte di un dato di tipo float la 1. o la 2. sono istruzioni equivalenti.
Si osservi che il valore di ritorno di sizeof ovvero la lunghezza in byte è un tipo di dato intero.
Torniamo nuovamente all’esempio 1. Le istruzioni:
a=(int *)malloc(n*sizeof(int));
b=(float *)malloc(n*sizeof(float));
per quanto detto consentono di allocare un vettore a di interi di dimensione n ed un array b di reali di dimensione n.
Le istruzioni:
free(a); free(b);
Consentono di restituire al sistema la memoria allocata per a e b.
In generale la memoria viene restituita esplicitamente mediante la funzione
free(ptr);
Problema
Scrivere una funzione di tipo main
che passa ad una funzione array dichiarato dinamicamente.
Nell’esempio si mette in evidenza che un array può essere passato come:
array1d(A,B,3);
oppure
array1d(&A[0],&B[0],5);
In C abbiamo visto l’utilizzo degli array bidimensionali allocato staticamente. Una matrice è una struttura dati che in memoria viene registrata per righe.
Per memorizzare dinamicamente una matrice, ed esempio di reali, è necessaria una dichiarazione del tipo:
float **a;
La variabile così definita è detta in gergo puntatore a puntatore. Per allocare una matrice di float ad esempio:
a=(float**)calloc(n,sizeof(float*));
for (i=0;i
a[i]=(float*)calloc(m,sizeof(float));
In maniera analoga si può utilizzare la funzione malloc.
Esempio Di una matrice A di dimensione 5 x 5, riportata in figura vogliamo accedere all’elemento di posizione A(2,3).
Utilizzando la sintassi dei puntatori l’elemento viene così individuato:
A(2,3) → *(*(A+2)+3)
(A+2) è il secondo puntatore;
*(A+2) è il contenuto del secondo puntatore ovvero l’indirizzo del primo elemento della seconda riga;
*(A+2)+3 è l’indirizzo del 3 elemento della seconda riga;
*(*(A+2)+3) è il contenuto del puntatore al 3 elemento della seconda riga.
Problema
Scrivere una funzione di tipo main
che passa ad una funzione un array bidimensionale dichiarato dinamicamente.
Nell’esempio si mette in evidenza che un array può essere passato come:
array2d(A,B,3);
oppure
array2d(&A[0],&B[0],5);
Problema
Scrivere una funzione di tipo main
che richiami una funzione matvet
per il calcolo del prodotto matrice vettore. Si utilizzi l’allocazione dinamica.
1. Prolusione
2. Sistemi Operativi – parte prima
3. Sistemi Operativi – parte seconda
6. Il linguaggio C – parte prima
8. Il linguaggio C – funzioni e puntatori
10. Il linguaggio C – parte terza
11. La documentazione del software
12. Dati strutturati
13. Esercizi sui dati strutturati
14. Approfondimenti di C, Stringhe e file
15. Esercizi su stringhe e file
16. La ricorsione
17. Il linguaggio c++ parte prima
18. Il linguaggio C++ - parte seconda
19. Strutture dati di tipo astratto