对于下面给出的程序,为什么第一个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;
}
将命令行参数存储到字符串数组的机制是什么
最佳答案
问题不在于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
具有相同的值。第二行需要解释一下。
可以看到,在函数foo
中传入a
时,a
的值没有改变,只是地址&a
已更改,因为 C 函数总是按值传递参数,函数内部将有参数的本地副本。
它与 argv
相同,因为它只是函数 main
中的一个参数。
编辑:对于那些不同意我的人,我的回答并不反对其他答案。相反,它们相互完善。 argv
是一个指针,正是因为它是一个作为函数参数传递的数组,并且它“退化”为一个指针。同样,argv
并不特殊,它的行为与作为函数参数传递的其他数组没有什么不同,这就是我的示例代码的全部要点。
关于c - argv 和普通字符串数组之间的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18350992/