这里有一个有趣的问题。如果你想把一个数组名参数传递给函数,正确的函数形参应该是怎样的?它是应该声明为一个指针还是一个数组?正如你所看到的那样,调用函数时实际传递的是一个指针,所以函数的形参实际上是个人指针。但为了使程序员新手更容易上手一些,编译器也接受数组形式的函数形参。因此,下面两个函数原型是相等的:
int strlen(char *string);
int strlen(char string[]);
这个相等性暗示指示指针和数组名实际上是相等的,但千万不要被它糊弄了!这两个声明确实相等,但只是在当前这个上下文环境中。如果它们出现在别处,就可能完全不同,就像前面讨论的那样。但对于数组形参,你可以使用任何一种形式的声明。你可以使用任一种声明,但哪个”更加准确”呢?答案是指针。因为实参实际上是个指针,而不是数组。同样,表达式 sizeof string 的值是指向字符的指针的长度,而不是数组的长度。现在你应该清楚为什么函数原型中的一维数组形参无需写明它的元素数目,因为函数并不为数组参数分配内存空间。形参只是一个指针,它指向的是已经在其他地方分配好内存的空间。这个事实解释了为什么数组形参与任何长度的数组匹配一它实际传递的只是指向数组第1个元素的指针。另一方面,这种实现方法使函数无法知道数组的长度。如果函数需要知道数组的长度,它必须作为一个显式的参数传递给函数。