5

对于下面给出的程序,为什么第一个打印和的printf值不同?第二个为和打印相同的值。传递给程序的参数变量的存储机制是什么?argv&argvprintfa&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;  
}

将命令行参数存储到字符串数组的机制是什么

4

2 回答 2

5

问题不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

第一行和第三行并不奇怪,因为对于数组arrarr并且&arr具有相同的值。第二行需要解释。

正如你所看到的,当a在函数中传递时foo,的值a没有改变,但是地址&a改变了,因为C函数总是按值传递参数,函数内部会有一个参数的本地副本。

与它相同,argv因为它只是函数中的一个参数main


编辑:对于那些不同意我的人,我的回答并不反对其他答案。相反,它们相互补充。argv正是一个指针,因为它是一个作为函数参数传递的数组,并且它“衰减”成一个指针。同样,argv它并不特别,它与作为函数参数传递的其他数组没有什么不同,这就是我的示例代码的重点。

于 2013-08-21T07:37:50.187 回答
4
于 2013-08-21T07:38:44.367 回答