Якщо вираз 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.
Чи можна додати адресу та номер?
Так, це можливо, тому що адреса є цілим числом без підпису, зазвичай представленим у шістнадцятковій нотації.