Se l'espressione type name[count]è scritta in qualche funzione, si dice al compilatore C di allocare sizeof(type)*countbyte sullo stack frame e calcolare l'indirizzo del primo elemento nell'array.
Se l'espressione type name[count]è scritta al di fuori di tutte le funzioni e definisce le definizioni, allora si dice al compilatore C di allocare sui sizeof(type)*countbyte del segmento di dati e calcolare l'indirizzo del primo elemento nell'array.
namein realtà è un oggetto costante che memorizza l'indirizzo del primo elemento nella matrice e ogni oggetto che memorizza un indirizzo di una certa memoria è chiamato puntatore, quindi questa è la ragione che trattate namecome un puntatore piuttosto che una matrice. Si noti che le matrici in C sono accessibili solo tramite puntatori.
Se countè un'espressione costante che restituisce zero, si dice al compilatore C di allocare zero byte sul frame dello stack o sul segmento di dati e restituire l'indirizzo del primo elemento nell'array, ma il problema nel fare ciò è che il primo elemento di array di lunghezza zero non esiste e non è possibile calcolare l'indirizzo di qualcosa che non esiste.
Questo è razionale quell'elemento n. count+1non esiste countnell'array -length, quindi questo è il motivo per cui il compilatore C proibisce di definire l'array a lunghezza zero come variabile dentro e fuori una funzione, perché qual è il contenuto di nameallora? Quale indirizzoname memorizza esattamente?
Se pè un puntatore, l'espressione p[n]è equivalente a*(p + n)
Dove l'asterisco * nell'espressione giusta è un'operazione di dereference del puntatore, che significa accedere alla memoria puntata p + no accedere alla memoria il cui indirizzo è memorizzato p + n, dove p + nè l'espressione del puntatore, prende l'indirizzo di pe aggiunge a questo indirizzo il numero nmoltiplica il dimensione del tipo di puntatore p.
È possibile aggiungere un indirizzo e un numero?
Sì, è possibile, poiché l'indirizzo è un numero intero senza segno comunemente rappresentato in notazione esadecimale.