Se l'espressione type name[count]
è scritta in qualche funzione, allora dici al compilatore C di allocare sul frame dello stack sizeof(type)*count
byte e calcola l'indirizzo del primo elemento dell'array.
Se l'espressione type name[count]
è scritta al di fuori di tutte le definizioni di funzioni e struct, allora dici al compilatore C di allocare sul segmento dati sizeof(type)*count
byte e calcola l'indirizzo del primo elemento dell'array.
name
è in realtà un oggetto costante che memorizza l'indirizzo del primo elemento dell'array e ogni oggetto che memorizza un indirizzo di una certa memoria è chiamato puntatore, quindi questo è il motivo per cui si tratta name
come puntatore anziché un array. Si noti che è possibile accedere agli array in C solo tramite puntatori.
Se count
è un'espressione costante che valuta zero, allora comunichi al compilatore C di allocare zero byte sul frame dello stack o sul segmento dati e restituire l'indirizzo del primo elemento dell'array, ma il problema nel fare questo è che il primo elemento dell'array di lunghezza zero non esiste e non puoi calcolare l'indirizzo di qualcosa che non esiste.
Questo è razionale quell'elemento n. count+1
non esiste in count
-length array, quindi questo è il motivo per cui il compilatore C vieta di definire l'array a lunghezza zero come variabile all'interno e all'esterno di una funzione, perché qual è il contenuto di name
quindi ? Quale indirizzo name
memorizza esattamente?
Se p
è un puntatore, l'espressione p[n]
equivale a *(p + n)
Dove l'asterisco * nell'espressione destra è operazione di dereferenziazione del puntatore, che significa accedere alla memoria puntata da p + n
o accedere alla memoria il cui indirizzo è memorizzato in p + n
, dove p + n
è espressione del puntatore, esso prende l'indirizzo di p
e aggiunge a questo indirizzo il numero n
moltiplica la dimensione del tipo del puntatore p
.
È possibile aggiungere un indirizzo e un numero?
Sì, è possibile, perché l'indirizzo è un numero intero senza segno comunemente rappresentato in notazione esadecimale.