обратите внимание на одну вещь,
Объявление
void foo(char buf[])
говорит, что будет использовать [] нотацию. Не какой элемент массива вы будете использовать.
Если вы хотите указать это, вы хотите получить какое-то конкретное значение, тогда вам следует объявить эту функцию как
void foo(char buf[X]); //where X would be a constant.
Конечно, это невозможно, потому что это было бы бесполезно (функция для работы с n-м элементом массива?). Вам не нужно записывать информацию, какой элемент массива вы хотите получить. Все, что вам нужно, это простая декларация:
voi foo(char value);
так ...
void foo(char buf[])
- это объявление, которое говорит, какую нотацию вы хотите использовать ([] - часть), а также содержит указатель на некоторые данные.
Более того ... что бы вы ожидали ... вы отправили в функцию foo имя массива
foo(buf);
, что эквивалентно & buf [0]. Итак ... это указатель.