对用数组做形参的一点思考,该怎么解决

对用数组做形参的一点思考
函数中的形参可以是数组,如int   root(int   a[]),函数声明中,a[]是形参,实际上真正的形参应是a,a是个常量,怎么能接受值呢?有解释说当a[]在函数中作为形参出现时,其属性就改变了,其中的a不再是常量,变成了指针变量,所以可以接受地址值。这个解释倒也说得过去,本人就想,既然a[]中得a是作为指针变量充当形参,那么干吗不直接用指针变量当形参呢?那样看起来更顺眼,也更容易理解。于是声明一函数如下:int   root(int   *p),其中的p接受一数组首地址,然后用p对数组进行操纵,没想到也行。现在我的问题是:这两种对形参定义的方式各自存在的意义是什么?它们之间有什么不同?

------解决方案--------------------
/*
在做形参时 *a 与 a[] 是等价的,实际上C编译器只是把a[]当成指针,
你甚至可以把a[]写成a[1]或者a[100],实际上C编译器把a[1]和a[100]都当成指针。
至于二维数组做实参时,形参的可用的形式就更多了!试试下面的程序就明白了!
*/

#include <stdio.h>

#define ROW (2)
#define COL (3)

static void foo(int *p)
{
int i;

for (i = 0; i < (ROW * COL); i++)
printf( "*(p + %d) = %d\n ", i, *(p + i));

}

static void bar(int (*p)[COL])
{
int i, j;

for (i = 0; i < ROW; i++)
for (j = 0; j < COL; j++)
printf( "p[%d][%d] = %d\n ", i, j, p[i][j]);

for (i = 0; i < ROW; i++)
for (j = 0; j < COL; j++)
printf( "(*(p+%d))[%d] = %d\n ", i, j, (*(p+i))[j]);

}

int main(void)
{

int a[ROW][COL] = { {0, 1, 2}, {3, 4, 5} };

int i, j;
for (i = 0; i < ROW; i++)
for (j = 0; j < COL; j++)
printf( "a[%d][%d] = %d\n ", i, j, a[i][j]);

foo(&a[0][0]);

bar(a);

return 0;
}