ok, eccomi cari signori
adesso ho tutto lo spazio che serve
quindi come promesso parliamo della differenza tra i due frammenti incriminati di programma
facendo l'esempio di array di char e di puntatori a char
char array[]="ma che bel castello";
e
char * puntatore = "ma che bel castello";
il primo alloca memoria per un array di 20, crea un oggetto array conosciuto dal compilatore, lo inizializza prendendo i dati da una costante simbolica e permette la modifica del contenuto dell'array (non della sua dimensione)
sono legali e lavorano come ci si aspetta cose come
sizeof array;
// notare senza parentesi, non è mica una funzione
// che correttamente riporta 20
array[1]='i';
// che correttamente trasforma la stringa in "mi che bel castello"
sono illegali e/o non funzionano cose come;
array=&"altra stringa";
// che tenta di cambiare l'indirizzo ASSOCIATO al nome dell'array e non, come si potrebbe pensare l'indirizzo CONTENUTO nel puntatore
la seconda forma invece alloca memoria solo per un puntatore, e "casualmente" in questo caso, lo inizializza ad una "costante simbolica"
in effetti sarebbe possibile anche:
char * puntatore;
che crea il puntatore, ma non lo inizializza ne alloca la costante simbolica, il puntatore esisterebbe comunque,
NULL, ma ci sarebbe
ora, lo standard non è chiaro su come vengono conservate le costanti simboliche, sembra che con Arduino siano comunque in RAM, anche se in generale non è garantito, e K&R dicono che non dovrebbe andare in memoria modificabile
quindi cose come queste NON vanno, o se vanno si comportano come non ci si aspetta
sizeof puntatore;
// restituisce 2, indipendentemente da quanto è lunga la stringa, e per qualunque tipo dati si usi
puntatore= & "un'altra stringa";
//che in effetti alloca una seconda costante simbolica e ne scrive l'indirizzo nel puntatore, anche se uno penserebbe che "cambia" la stringa puntata
// letteralmente è così: fa si che il puntatore punti a una stringa differente, in un'altra posizione di memoria
// anche se con "cambia la stringa" di solito si intende "ne cambia il contenuto"
// anche questo:
*(puntatore+1)='i';
// non è corretto, anche se sembra che con arduino vada
// cambia il secondo carattere di una costante simbolica allocata in memoria, ma abbiamo visto che non è detto che sia memoria RAM
puntatore=array;
// incredibilmente va, anche se NON copia, come a prima vista un inesperto potrebbe credere
// dicevo: NON copia il contenuto dell'array, ma cambia il contenuto del puntatore per farlo puntare al primo carattere dell'array di caratteri
// di contro questo non va:
array=puntatore;
per semplificare diciamo che
char array[]="stringa";
equivale (non proprio, ma quasi) a:
char * const array = "stringa";
mentre
char * puntatore = "stringa";
equivale (non proprio, ma quasi) a:
const char * array = "stringa";
ma rimane il fatto che sizeof fa il suo dovere solo con gli array
tutto questo "cinema" è dovuto al fatto che "effettivamente" gli array sono alle volte gestiti come se fossero dei puntatore, ma "esistono" a parte
mentre un puntatore ha significato solo per aree di memoria effettivamente inizializzate