Dug*_*ggs 5 c arrays pointers command-line-arguments
对于下面给出的程序,为什么第一个printf
打印不同的值argv
和&argv
?第二个printf
为a
和打印相同的值&a
.传递给程序的参数变量存储的机制是什么?
#include<stdio.h>
int main(int argc, char * argv[]){
char * a[10];
printf("%d %d\n\n",argv,&argv);
printf("%d %d",a,&a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将命令行参数存储到字符串数组的机制是什么
问题不是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;
}
Run Code Online (Sandbox Code Playgroud)
我机器的输出:
main:0x7fffb4ded680 0x7fffb4ded680
foo :0x7fffb4ded680 0x7fffb4ded628
foo :0x7fffb4ded630 0x7fffb4ded630
Run Code Online (Sandbox Code Playgroud)
第一行和第三行对于数组来说并不奇怪arr
,arr
并且&arr
具有相同的值.需要解释第二行.
正如您所看到的,当a
函数传递时foo
,值a
不会更改,但地址&a
会更改,因为C函数始终按值传递参数,函数内部将存在参数的本地副本.
它是一样的,argv
因为它只是函数中的一个参数main
.
编辑:对于那些不同意我的人,我的答案并不反对另一个答案.相反,他们互相完成.argv
是一个指针,因为它是一个作为函数参数传递的数组,并且它"衰减"成一个指针.同样,argv
并不特殊,它与作为函数参数传递的其他数组没有什么不同,这是我的示例代码的全部要点.