INTRODUZIONE ALLA PROGRAMMAZIONE IN C



Array multidimensionali e puntatori



In C dobbiamo pensare agli array multidimensionali in un modo diverso: un array a due dimensioni e' un array monodimensionale i cui elementi sono a loro volta degli array. Gli elementi degli array vengono memorizzati riga per riga. Avevamo visto che per passare un array a una funzione si deve specificare il numero di colonne, mentre non e' necessario specificare il numero di righe. La ragione di questo e' dovuta ai puntatori, in quanto il C deve sapere il numero di colonne per saltare di riga in riga in memoria. Si consideri ad esempio di passare l'array a[5][35] ad una funzione f; si puo' dichiarare: f(int a[][35]){...} oppure f(int(*a)[35]){...} Necessitano le parentesi per (*a) perche' il vettore abbia una precedenza maggiore rispetto ad *. Si noti cosi' la differenza tra: int (*a)[35]; dichiara un puntatore ad un array di 35 int int *a[35]; dichiara un array di 35 puntatori a int Consideriamo ora la sottile differenza tra puntatori ed array. Ad esempio: char *name[10]; char Aname[10][20]; in C e' possibile dichiarare legalmente sia name[3][4] che Aname[3][4]. Comunque:

Se ogni puntatore nel vettore "name" e' settato per puntare ad un array di 20 elementi, solo in quel caso verranno riservati 200 chars (+ 10 elementi). Il vantaggio di una dichiarazione fatta nel secondo modo e' quello che ogni pointer puo' puntare a vettori di lunghezza diversa. Un tipico esempio di puntatore ad un array sono le stringhe. Consideriamo un esempio: #include <stdio.h> main() { char *s[5]; *s="ciao"; printf("%s\n",*s); }