c语言函数形参里写一个指针a[]，那如果在这里写上数值a[5]，那这是什么？
他是一个指针还是一个数组呢？如果是数组那这是一维数组还是个指针数组？为什么a[]能和*a等价呢，是因为实参如果是数组传递的都是地址吗？
> A declaration of a parameter as ''array of type'' shall be adjusted to> ''qualified pointer to type'', where the type qualifiers (if any) are those> specified within the [ and ] of the array type derivation.

如果将参数声明为「某类型的数组」，会被编译器调整为「指向该类型的数组」。方括号里的类型限定符会作为这个指针的限定符使用。

也就是说，你写了数组也是指针：

            void foo(int bar[])    // 会被调整为    void foo(int *bar)        void foo(int const bar[])    // 会被调整为    void foo(int const *bar)  // 指向类型为 const         void foo(int bar[const])    // 会被调整为    void foo(int *const bar)  // 指针本身为 const        void foo(int bar)    // 会被调整为    void foo(int *bar)  // 方括号里的不是类型限定符

> 他是一个指针还是一个数组呢？如果是数组那这是一维数组还是个指针数组？

它是指针。

> 为什么a[]能和*a等价呢？是因为实参如果是数组传递的都是地址吗？

就是规定而已。你要说为什么这么规定，确实这么一规定会省事很多，而且自洽。