Якщо вираз type name[count]
записаний в якійсь функції, то ви скажете компілятору C виділити на sizeof(type)*count
байт кадру стека і обчислити адресу першого елемента в масиві.
Якщо вираз type name[count]
записаний за межами всіх функцій і структурує визначення, то ви скажете компілятору C виділити по sizeof(type)*count
байтах сегмента даних і обчислити адресу першого елемента в масиві.
name
насправді це постійний об'єкт, який зберігає адресу першого елемента в масиві, і кожен об'єкт, який зберігає адресу деякої пам'яті, називається покажчиком, тому це причина, яку ви трактуєте name
як вказівник, а не як масив. Зауважте, що до масивів на C можна отримати доступ лише через покажчики.
Якщо count
це постійний вираз, який оцінюється до нуля, то ви скажете компілятору C виділити нульові байти або в кадрі стека, або в сегменті даних, і повернути адресу першого елемента в масиві, але проблема при цьому полягає в тому, що перший елемент масиву нульової довжини не існує, і ви не можете обчислити адресу чогось, що не існує.
Це раціонально, що елемент немає. count+1
не існує count
масиву -length, тому це є причиною того, що компілятор C забороняє визначати масив нульової довжини як змінну в і поза функцією, тому що тоді вміст name
? Яка адреса name
зберігається саме?
Якщо p
вказівник, то вираз p[n]
еквівалентний*(p + n)
Якщо зірочка * у правильному виразі - це операція з відмежуванням вказівника, що означає доступ до пам’яті, на яку вказує, p + n
або доступ до пам’яті, адреса якої зберігається p + n
, де p + n
вираження вказівника, вона бере адресу p
та додає до цієї адреси число, n
помножуючи на розмір типу вказівника p
.
Чи можна додати адресу та номер?
Так, це можливо, тому що адреса є цілим числом без підпису, зазвичай представленим у шістнадцятковій нотації.