Originariamente inviato da Lucked
ciao anx, grazie.
approfitto per qualche domanda:
non mi è chiara la simbologia:
char *a[] questo come si legge?
allora, [] inidca che stai dichiarano un array, * indica che stai dichairando un puntatore, pero [] ha una precendenza maggiore di *, quindi
char *a[]
corrisponde a
(char *)a[]
ovvero char *a[] è un array di puntatori a char*
Originariamente inviato da Lucked
fra l'altro il prof mi ha detto che corrisponde a questo: char **a
è vero? :bubu: [/B]
In parte si e in parte no: puoi usare array di puntatori a char laddove è richiesto un char**, ma non viceversa.
Un array di char (char a[])altro non è che un puntatore COSTATE ad una zona di memoria occupata da una successione di variabili di tipo char; un avolta dichiarato con:
char a[10];
a punta ad un certo indirizzo, che corrisponde all' indirizzo della prima delle 10 variabili, e non puo essere riassegnato, cioè non puoi fare:
a = ....
perche un array è COSTANTE, anche se puoi riassegnare i suoi elementi: a[i] = 'a';
Invece un puntatore è una variablie che mantiene l'indirizzo di una locazione di memeoria in cui sarà conservata una variabile di un certo tipo, e puo essere riassegnatoad esempio:
int a[10];
int *p = a //assegno a p il puntatore rappresentato da a
a[0] == p[0] restituisce 1 (true)
Puntatori a puntatori. I puntatori sono variabili e per tanto hannno una locazione di memoria in cui c'è il loro valore, pertanto si puo avere un puntatore che punta ad una variabile puntatore.
Uno degli usi dei puntaotri e quello di creare dinamicamente un array, uno degli usi dei puntatori a puntatori è di creare dinamicamente array bidimensionali:
codice:
char **array = (char **)malloc(n * sizeof(char *));
for(i = 0; i < n; i++)
array[i] = (char *) malloc(MAX_DIM_STRINGA * sizeof(char));
array è un char**: un puntatore a un puntatore a char.
quindi array[i] è un char *: puntatore a char
Analogamente
char *array[10];
è un array di puntatori a char, ma array non puo essere riassegnato, inoltre array è allocato staticamente , cioè basta dichiararlo per allocarlo; questo vale per array, ma non per le sue variabili, cioè ogni array[i] deve essere a sua volta allocato dinamicamente, ma non bisogna allocare memoria per array.
codice:
char *array[10];
char **a = array; //OK, a ora punta alla stesssa locazione a cui
//punta array, a è un puntatore alla prima
//locazione di array
equivalente a:
a = &array[0]
Ci vuole un po di tempo per acquisire dimistichezza coi puntatori in c...
errore frequente:
int *p; //p dichiarato come puntatore a int e non inizializzato
*p = 10; //assegno a alla locazione puntata da p il valore intero 10
il problema sta nel fatto che p non è inizializzato e punta in una qualsiasi locazione della memoria, il cui valore sarà sovrascritto col valore 10, cuasando un errore.