argv和普通字符串数组之间的输出不同

Dug*_*ggs 5 c arrays pointers command-line-arguments

对于下面给出的程序,为什么第一个printf打印不同的值argv&argv?第二个printfa和打印相同的值&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)

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

Yu *_*Hao 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;
}
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并不特殊,它与作为函数参数传递的其他数组没有什么不同,这是我的示例代码的全部要点.