问题不argv
在于特殊,而在于函数参数传递。试试这个程序:
#include<stdio.h>
void foo(int a[])
{
int b[10];
printf("foo :%p %p\n",a,&a);
printf("foo :%p %p\n",b,&b);
}
int main(int argc, char* argv[])
{
int a[10];
printf("main:%p %p\n", a, &a);
foo(a);
return 0;
}
我机器上的输出:
main:0x7fffb4ded680 0x7fffb4ded680
foo :0x7fffb4ded680 0x7fffb4ded628
foo :0x7fffb4ded630 0x7fffb4ded630
第一行和第三行并不奇怪,因为对于数组arr
,arr
并且&arr
具有相同的值。第二行需要解释。
正如你所看到的,当a
在函数中传递时foo
,的值a
没有改变,但是地址&a
改变了,因为C函数总是按值传递参数,函数内部会有一个参数的本地副本。
与它相同,argv
因为它只是函数中的一个参数main
。
编辑:对于那些不同意我的人,我的回答并不反对其他答案。相反,它们相互补充。argv
正是一个指针,因为它是一个作为函数参数传递的数组,并且它“衰减”成一个指针。同样,argv
它并不特别,它与作为函数参数传递的其他数组没有什么不同,这就是我的示例代码的重点。