В обоих случаях массивы распадаются на тип указателя, а ваша функция на самом деле это:
void fun (char *a);
Именно поэтому она работает.
Я хотел бы подчеркнуть, что void fun(char*)
точно такой же, как void fun(char[10])
.10
не имеет никакого значения вообще.На самом деле, 10
настолько не важен и бесполезен, что вы можете даже полностью его опустить, как:
void fun (char a[]); //exactly same as `char*` or `char[10]`.
Это означает, все следующие объявления функций точно same:
void fun(char a[10]);
void fun(char a[]); //10 is unimportant in the above declaration
void fun(char *a); //same as above two declarations!
Надеюсь, что прояснит ваше сомнение.
Однако, если вы напишите это:
void fun (Char10 & a) ; //note &
тогда, это фактически так:
void fun (char (&a)[10]) ; //equivalent!
Тогда fun(b)
не будет компилироваться, поскольку теперь fun
будет принимать ТОЛЬКО массив ТОЧНОГО размера 10. И массив будет не распадаться на указатель , он будет передан по ссылке .
char a[10], b[11];
char *c=new char[10];
fun(a); //okay
fun(b); //error - type mismatch due to size of the array
fun(c); //error - type mismatch due to c being pointer.