Массив в C очень хрупкий тип.Есть много ситуаций, в которых массив распадается на указатель на первый элемент, и передача массива в качестве аргумента функции является такой ситуацией.Вот:
int main()
{
char data[10]; // sizeof(data) == 10
return call_me(data); // data is equivalent to &data[0] here!
}
int call_me(char x[])
// int call_me(char * x) // same thing!
{
// here sizeof(x) == sizeof(char *)
// ...
}
Массивы свойственны C в том смысле, что они не могут быть переданы в качестве аргументов функции или возвращены из функций, поэтому вы часто будете видеть указатели, когда ожидаете массивы.Вызывающий (вы!) Обязан предоставить достаточно информации, чтобы правильно интерпретировать указатель как массив.
Обратите внимание, что общая идиома C создает «массив» динамически полностью без упоминания типа массива:char * p = malloc(10);
Здесь p
- это не что иное, как указатель, и вы должны помнить, что вы можете рассматривать его как массив.
(Ситуация немного лучше в C ++, где выможет передавать фактические массивы по ссылке.)