Когда вы говорите
char a[5];
компилятор выделяет 5 последовательных блоков памяти, а адрес первого блока назначается a. Таким образом, по определению имя массива (в нашем случае - это просто указатель на ячейку памяти).
Теперь, когда мы говорим [0], компилятор манипулирует им как * (a + 0 * sizeof (тип данных массива, т.е. char, int и т. Д.)), Символически a [i] представляется как * (a + i * sizeof (массив данных, например, char, int и т. д.))
Что касается передачи параметров функции Когда мы передаем массив в функцию, то в основном это просто адрес первого элемента, который передается. Для получения более подробной информации об этом PLZ перейдите по этой ссылке или прочитайте ответ @ cnicutar (поскольку он уже опубликовал правильный ответ, нет смысла повторять это снова) ...