代码之家  ›  专栏  ›  技术社区  ›  Jin

C中命令行参数“argv”的类型是什么?

  •  18
  • Jin  · 技术社区  · 8 年前

    我正在阅读C Primer Plus中关于命令行参数的一节 argv 我很难理解这个句子。

    上面说,

    程序将命令行字符串存储在内存中,并将 指针数组中每个字符串的地址。这个的地址 指针被称为 自动变速箱 ,用于参数值。

    这是否意味着命令行字符串作为指向数组的指针数组存储在内存中 char ?

    7 回复  |  直到 8 年前
        1
  •  27
  •   haccks    8 年前

    argv 类型为 char ** . 它不是数组 。它是指向的指针 char 。命令行参数存储在内存中,每个内存位置的地址存储在数组中。此数组是指向 烧焦 . 自动变速箱

                      Some
                      array
    
                     +-------+        +------+------+-------------+------+
    argv ----------> |       |        |      |      |             |      |
                     | 0x100 +------> |      |      | . . . . . . |      |  Program Name1
             0x900   |       |        |      |      |             |      |
                     |       |        +------+------+-------------+------+
                     +-------+         0x100  0x101
                     |       |        +------+------+-------------+------+
                     | 0x205 |        |      |      |             |      |
             0x904   |       +------> |      |      | . . . . . . |      |  Arg1
                     |       |  .     |      |      |             |      |
                     +-------+        +------+------+-------------+------+
                     |  .    |  .      0x205  0x206
                     |  .    |
                     |  .    |  .
                     |  .    |
                     +-------+  .     +------+------+-------------+------+
                     |       |        |      |      |             |      |
                     | 0x501 +------> |      |      | . . . . . . |      |  Argargc-1
                     |       |        |      |      |             |      |
                     +-------+        +------+------+-------------+------+
                     |       |         0x501  0x502
                     | NULL  |
                     |       |
                     +-------+
    
    
    0xXXX Represents memory address
    
    

    argv[0] 表示程序名,但如果程序名在主机环境中不可用,则 argv[0][0] 表示空字符。

        2
  •  17
  •   Sourav Ghosh    8 年前

    直接引用自 C11 ,第§5.1.2.2.1/p2章,程序启动, (重点矿井)

    int main(int argc, char *argv[]) { /* ... */ }

    […]如果 argc 大于零, 数组成员 argv[0] 通过 argv[argc-1] inclusive应包含指向字符串的指针

    […]和 argv 数组[…]

    所以,基本上, 自动变速箱 是指向字符串数组第一个元素的指针 。这可以从 ,

    int main(int argc, char **argv) { /* ... */ }

    您可以将其重新表述为指向指向以null结尾的第一个元素的指针数组的第一个要素的指针 char 数组,但我更喜欢使用字符串。


    注:

    澄清的用法 “指向数组第一个元素的指针” 在上述答案中,遵循§6.3.2.1/p3

    除非它是 sizeof 操作员 _Alignof 操作员,或 一元的 & 运算符,或是用于初始化数组的字符串文字, 具有以下特征的表达式 类型 类型数组 转换为类型为的表达式 指向类型的指针 这一点 到数组对象的初始元素

        3
  •  11
  •   M.M    8 年前

    这条帖子真是一团糟。情况如下:

    • 有一个数组 argc+1 类型的元素 char * .
    • argv 指向该数组的第一个元素。
    • argc 类型的其他数组 char 以及各种长度,其中包含以null结尾的字符串,这些字符串表示命令行参数。
    • 指针数组的元素指向 烧焦

    有时人们会写“指针指向X数组”,意思是“指针指向一个X数组的第一个元素”。你必须使用上下文和类型来判断它们是否真的有这个意思。

        4
  •  1
  •   blue112    8 年前

    是的,确实如此。

    argv char** char*[] ,或者只是一个char*指针数组。

    因此argv[0]是一个 char* (字符串)和 argv[0][0] 是一个 char .

        5
  •  0
  •   Peter Mortensen Sumit Kumar    8 年前

    的类型 argv char** ,即指向的指针 char 基本上,如果您考虑 char* 成为一根绳子,那么 自动变速箱 是指向字符串数组的指针。

        6
  •  0
  •   autistic    2 年前

    严格地说,有许多属性必须存在于 argv 成为一个数组。让我们考虑其中一些:

    /空指针不能指向数组,因为 null pointer are guaranteed to be an address distinct from that of any object 因此 自动变速箱 以下代码中不能是数组:

    #include <assert.h>
    int main(int argc, char *argv[]) {
        if (argv) return main(0, 0);
        assert(argv == 0); // argv is a null pointer, not to be dereferenced
    }
    

    /分配给数组是无效的。例如 char *argv[] = { 0 }; argv++; 是违反约束,但 int main(int argc, char *argv[]) { argv++; } 编译和运行良好。因此,我们必须从这一点得出结论: 自动变速箱 声明为参数时不是数组,而是指向数组的指针。(这实际上与第1点相同,但从不同的角度来看 main 空指针为 自动变速箱 实际上正在重新分配 自动变速箱 ,一些我们无法对数组执行的操作)。

    /…正如C标准所说:

    sizeof数组/sizeof数组[0]

    例如:

    #include <assert.h>
    int main(int argc, char *argv[]) {
        size_t size = argc+1; // including the NULL
        char *control[size];
        assert(sizeof control / sizeof *control == size); // this test passes, because control is actually an array
        assert(sizeof argv   / sizeof *argv    == size); // this test fails for all values of size != 1, indicating that argv isn't an array
    }
    

    /一方当事人 & 运算符的地址定义为,当应用于数组时,将产生不同类型的相同值,例如:

    #include <assert.h>
    int main(int argc, char *argv[]) {
        char *control[42];
        assert((void *) control == (void *) &control); // this test passes, because control is actually an array
        assert((void *) argv    == (void *) &argv); // this test fails, indicating that argv isn't an array
    }
    
        7
  •  -1
  •   QuestionC    8 年前

    argv

    以下代码显示的值 自动变速箱 ,的内容 自动变速箱 自动变速箱 希望这能说明间接的含义。

    #include <stdio.h>
    #include <stdarg.h>
    
    print_memory(char * print_me)
    {
        char * p;
        for (p = print_me; *p != '\0'; ++p)
        {
            printf ("%p: %c\n", p, *p);
        }
    
        // Print the '\0' for good measure
        printf ("%p: %c\n", p, *p);
    
    }
    
    int main (int argc, char ** argv) {
        int i;
    
        // Print argv
        printf ("argv: %p\n", argv);
        printf ("\n");
    
        // Print the values of argv
        for (i = 0; i < argc; ++i)
        {
            printf ("argv[%d]: %p\n", i, argv[i]);
        }
        // Print the NULL for good measure
        printf ("argv[%d]: %p\n", i, argv[i]);
        printf ("\n");
    
        // Print the values of the memory pointed at by argv
        for (i = 0; i < argc; ++i)
        {
            print_memory(argv[i]);
        }
    
        return 0;
    }
    

    样品运行:

    $ ./a.out Hello World!
    argv: ffbfefd4
    
    argv[0]: ffbff12c
    argv[1]: ffbff134
    argv[2]: ffbff13a
    argv[3]: 0
    
    ffbff12c: .
    ffbff12d: /
    ffbff12e: a
    ffbff12f: .
    ffbff130: o
    ffbff131: u
    ffbff132: t
    ffbff133:
    ffbff134: H
    ffbff135: e
    ffbff136: l
    ffbff137: l
    ffbff138: o
    ffbff139:
    ffbff13a: W
    ffbff13b: o
    ffbff13c: r
    ffbff13d: l
    ffbff13e: d
    ffbff13f: !
    ffbff140:
    
    $
    

    ffbff12c ffbff140 其中包含命令行参数(标准不保证是连续的,但通常是这样做的)。 自动变速箱 只包含指向该数组的指针,以便您知道在哪里查找单词。

    自动变速箱 是指针…指向指针…指向字符