谨记一个真理:在c语言中,我们没有办法可以将一个数组作为函数参数直接传递。
如果我们使用数组名作为参数,那么 数组名会立刻被转换为指向该数组第1个元素的指针。
例如,下面的语句:
char hello[] = "hello";
声明了 hello 是一个字符数组。如果将该数组作为参数传递给一个函数,
printf("%s\n", hello);
实际上与将该数组第1个元素的地址作为参数传递给函数的作用完全等效,即:
printf("%s\n*, &hello[0]);
因此,将数组作为函数参数毫无意义。
所以,C语言中会自动地将作为参数的数组声明转换为相应的指针声明。也就是说,像这样的写法:
int strlen (char s[]) {
/*具体内容*/
return 0;
}
与下面的写法完全相同:
int strlen (char* s) {
/*具体内容*/
return 0;
}
下面这种写法:
extern char *hello;
与这种写法也完全相同。
extern char hello[];
数据的这种多样性定义,被某些编程者称为 最垃圾的设定,容易造成混淆错觉,却又没有什么意义。
但如果真要较真他们之间的差异,还是有的,例如:
int main(int argc, char* argv[]) {
/*具体内容*/
return 0;
}
与
int main(int argc, char** argv) {
/*具体内容*/
return 0;
}
上面一种写法,更加强调 argv 是一个字符串数组,而下面那种写法,更强调的是 argv 是一个字符的二维数组。编程者可以任选一种写法来 清晰反映自己的设计意图,这或许就是这个语言设计的初衷。