问题的阵列的机制不是关于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
不是特殊的,它与其他作为函数参数传递的数组没有区别,这就是我的示例代码的全部意义。
printf(“%d%d”,a,&a);这里&a和a将指向相同的地址......所以您不需要同时打印它们,并使用%p代替%d来打印地址。 – sunny1304
我认为这是因为argv指针已初始化,但您的指针并非如此得到相同的地址 – Saxtheowl