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

时间:2016-08-23 08:16:25

标签: c arrays pointers language-lawyer argv

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

它说,

  

程序将命令行字符串存储在内存中并存储   指针数组中每个字符串的地址。这个地址   数组存储在第二个参数中。按照惯例,这个指针指向   对于参数值,指针称为argv

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

6 个答案:

答案 0 :(得分:23)

argv的类型为char **它不是数组。它是指向char的指针。命令行参数存储在存储器中,每个存储器位置的地址存储在一个数组中。该数组是指向char的指针数组。 argv指向此数组的第一个元素。

                  Some
                  array

                 +-------+        +------+------+-------------+------+
argv ----------> |       |        |      |      |             |      |
                 | 0x100 +------> |      |      | . . . . . . |      |  Program Name1
         0x900   |       |        |      |      |             |      |
                 |       |        +------+------+-------------+------+
                 +-------+         0x100  0x101
                 |       |        +------+------+-------------+------+
                 | 0x205 |        |      |      |             |      |
         0x904   |       +------> |      |      | . . . . . . |      |  Arg1
                 |       |  .     |      |      |             |      |
                 +-------+        +------+------+-------------+------+
                 |  .    |  .      0x205  0x206
                 |  .    |
                 |  .    |  .
                 |  .    |
                 +-------+  .     +------+------+-------------+------+
                 |       |        |      |      |             |      |
                 | 0x501 +------> |      |      | . . . . . . |      |  Argargc-1
                 |       |        |      |      |             |      |
                 +-------+        +------+------+-------------+------+
                 |       |         0x501  0x502
                 | NULL  |
                 |       |
                 +-------+


0xXXX Represents memory address

<子> 1。在大多数情况下,argv[0]表示程序名称,但如果主机环境中没有程序名称,则argv[0][0]表示空字符。

答案 1 :(得分:15)

直接引用C11,章节§5.1.2.2.1/ p2,程序启动,(强调我的)

  

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

     

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

  

[...]以及argv数组[...]

指向的字符串

因此,基本上,argv是指向字符串 note 数组的第一个元素的指针。这可以通过替代形式

更清晰
  

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

你可以将它改为指向指向以null结尾的char数组的第一个元素的指针数组的第一个元素的指针,但我更喜欢坚持使用字符串。

注:

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

  

除非它是sizeof运算符,_Alignof运算符或者&运算符的操作数。   一元 function changeTopic(sel){ var topicId = sel.value; document.topicSelectionFormId.action = topicId; document.topicSelectionFormId.submit(); }运算符,或者是用于初始化数组的字符串文字,一个表达式   type ''类型''的数组被转换为类型''指向类型''指针的表达式   到数组对象的初始元素并且不是左值。 [...]

答案 2 :(得分:11)

这个线程是这样的火车残骸。情况如下:

  • 有一个数组argc+1 char *元素的数组。
  • argv指向该数组的第一个元素。
  • argc个其他类型char的数组和各种长度,包含表示命令行参数的空终止字符串。
  • 指针数组的元素每个都指向char数组之一的第一个字符;除了指针数组的最后一个元素,它是一个空指针。

有时人们写&#34;指向X&#34;表示&#34;指向X&#34;数组的第一个元素的指针。你必须使用上下文和类型来确定它们是否确实意味着它。

答案 3 :(得分:0)

是的,确实。

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

所以argv [0]是char*(字符串),argv[0][0]char

答案 4 :(得分:0)

argv的类型是char**,即指向char指针的指针。基本上,如果您认为char*是一个字符串,那么argv是指向字符串数组的指针。

答案 5 :(得分:0)

argv是一个指向字符的指针数组。

以下代码显示argv的值,argv的内容,并在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:

$

你有一个大的连续数组,范围从ffbff12cffbff140,其中包含命令行参数(这不能保证是标准的连续,但它是如何一般的完成)。 argv只包含指向该数组的指针,因此您可以知道在哪里查找单词。

argv是指针......指向字符