Se l'espressione type name[count]
è scritta in qualche funzione, si dice al compilatore C di allocare sizeof(type)*count
byte 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)*count
byte del segmento di dati e calcolare l'indirizzo del primo elemento nell'array.
name
in 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 name
come 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+1
non esiste count
nell'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 name
allora? 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 + n
o accedere alla memoria il cui indirizzo è memorizzato p + n
, dove p + n
è l'espressione del puntatore, prende l'indirizzo di p
e aggiunge a questo indirizzo il numero n
moltiplica 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.