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

标签 c arrays pointers command-line-arguments

对于下面给出的程序,为什么第一个printfargv&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;  
}

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

最佳答案

问题不在于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 具有相同的值。第二行需要解释一下。

可以看到,在函数foo中传入a时,a的值没有改变,只是地址&a 已更改,因为 C 函数总是按值传递参数,函数内部将有参数的本地副本。

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


编辑:对于那些不同意我的人,我的回答并不反对其他答案。相反,它们相互完善。 argv 是一个指针,正是因为它是一个作为函数参数传递的数组,并且它“退化”为一个指针。同样,argv 并不特殊,它的行为与作为函数参数传递的其他数组没有什么不同,这就是我的示例代码的全部要点。

关于c - argv 和普通字符串数组之间的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18350992/

相关文章:

arrays - Postgres 不在数组中

arrays - 在 bash robuSTLy 中传递部分命令

c - C 中指针作为参数

c - 哪种使用 C 数组的数据组织可以生成最快的代码,为什么?

stack - 通过堆栈传递数据

c - 堆或堆栈结构中的静态数组?

c - 使用 fscanf 读取 boolean 值

c - 如何将字符串解析为结构?

c - 如何将 append 结构添加到结构数组的末尾?在 C

c++ - 初始化指向对象的指针