01: // passaggio array monodimensionale a funzione, intercambiabilita' delle modalita' di passaggio
02: #include<stdio.h>
03: #include<stdlib.h>
04: #include<time.h>
05: 
06: // 3 possibilita'
07: //  1: dimensioni note a priori (array statico)
08: //  2: VLA
09: //  3: come puntatori a puntatori
10: 
11: // LE FUNZIONO SONO IDENTICHE A PRIMA!
12: 
13: // DIMENSIONI NOTE A PRIORI
14: // questa funzione stampa solamente il contenuto di un array di dimensioni ben definite
15: // al momento della compilazione
16: #define SIZE 8
17: void stampa(int a[SIZE])
18: {
19:   for(int i = 0; i < SIZE; ++i)
20:     printf("%d ", a[i]);
21:   printf("\n");
22: }
23: 
24: // USO VLA
25: // se non conosco le dimensioni a priori allora posso sfruttare
26: // i VLA se il mio compilatore li ammette
27: void stampa_vla(int dim, int a[dim]) // nell'elenco dei parametri l'array DEVE essere DOPO le dimensioni
28: {
29:   for(int i = 0; i < dim; ++i)
30:     printf("%d ", a[i]);
31:   printf("\n");
32: }
33: 
34: // PUNTATORI
35: // in maniera piu' generale posso usare
36: // i puntatori
37: void stampa_punct(int *a, int dim) // ma comunque devo passare lo stesso le dimensioni in qualche modo...
38: {
39:   for(int i = 0; i < dim; ++i)
40:     printf("%d ", a[i]);
41:   printf("\n");
42: }
43: 
44: 
45: int main(int argc, char **argv){
46: 
47:   srand(time(NULL));
48: 
49:   int n;
50: 
51:   printf("Dimmi quanti numeri casuali generare: ");
52:   scanf("%d", &n);
53:   
54: 
55:   // alloco con VLA (per semplicita')
56:   int numbers[n];
57: 
58:   // riempo di valori casuali
59:   for(int i = 0; i < n; ++i)
60:       numbers[i] = rand()%1000;
61: 
62:   // pur avendo allocato con VLA
63:   // di fatto posso passare quell'array ad una qualunque delle funzioni definite
64:   // infatti a basso livello qualunque array e' un puntatore, io passo
65:   // sempre l'indirizzo di un puntatore
66:   
67:   printf("\n");
68:   stampa(numbers); // unico limite, questa funziona correttamente solo se n>=8 e comunque stampa solo 8 elementi
69:   
70:   printf("\n");
71:   stampa_vla(n, numbers);
72: 
73:   printf("\n");
74:   stampa_punct(numbers, n);
75: 
76: 
77:   return 0;
78: }
79: 
80: 


Se avete commenti o osservaƶioni su questa pagina
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it