【问题标题】:What does char * argv[] means?char * argv[] 是什么意思?
【发布时间】:2013-05-21 09:19:02
【问题描述】:

我是 C 编程新手,遇到了一个问题。
如果声明复杂,我发现了这个

int *daytab[13]; // daytab is an array of 13 pointers to int

表示daytab是数组名,数组名指向数组的第一个元素。数组名称与 daytab++ 等指针操作不兼容(如果我错了,请纠正我)。

但我发现这段代码是用 Dennis Ritchie 写的

main(int argc, char * argv[]) {
    while( --argc > 0 )                    
        printf("%s%s",*++argv,(argc>1) > " " : "");

    printf("\n");
    return 0;
}

他们如何操纵argv?不是数组名吗?

【问题讨论】:

  • 它是一个指向系统传递给您的应用程序的所有参数的 (char) 数组的指针,argc 包含相同的计数
  • 在包含printf 的行中 - 最后一位不应该是(argc>1) ? " " : "" 吗?独立的“>”似乎不正确。对我来说,它看起来应该在打印时在参数之间放置一个空格,但在最后一个 arg 之后没有空格。
  • 我非常震惊,四年过去了,没有引用 Clockwise Spiral Rule 来解释 C 变量声明。哦,等等... :-)
  • 解释 C 变量声明的绝佳资源cseweb.ucsd.edu/~ricko/rt_lt.rule.html

标签: c arrays pointers kernighan-and-ritchie


【解决方案1】:

参数 char * argv[] 衰减为指针 char ** argv。您同样可以将main() 的函数签名写为:

int main(int argc, char ** argv)

您可以使用main() 中的指针argv 做任何您想做的事情,例如,argv++ 只是将argv 指向argv[1] 而不是argv[0]

argv ---> argv[0] ---> "program"
          argv[1] ---> "arg1"
          argv[2] ---> "arg2"
           ...          ...
          argv[argc] == NULL

【讨论】:

  • 那么为什么不在 char argv[] 的情况下呢??
  • char argv[] 表示单个字符串,char *argv[] 表示多个字符串。
  • 非常感谢!!知道了 !!因为它是一个函数参数! :)
  • @akash argv[argv] ---> NULL
  • @BobJarvis 是的,谢谢,我的意思是 argv[argc] ---> NULLargv字符串数组 以 NULL 结尾。
【解决方案2】:

argvchar* 的数组。执行++argv 意味着访问数组的下一个单元。 * 表示我们需要单元格的值,而不是地址。

【讨论】:

    【解决方案3】:

    当一个程序启动时,它会在主函数中获取它的参数。这就是你通常写作的原因。

    int main(int argc, char *argv[])
    

    这仅仅意味着 argv 是指向 argc 所指示的尽可能多的参数字符串的指针(== 参数计数)。由于 argv 衰减为 char **argv 你也可以增加它,否则你就像一个指针一样。

    所以如果你想从命令行打印所有参数:

    int main(int argc, char *argv[])
    {
       for(int i = 0; i < argc; i++)
           printf("%s\n", argv[i]);
    
       for(int i = 0; i < argc; i++)
           printf("%s\n", argv++);
    
        return 0;
    }
    

    【讨论】:

    • 请注意,此代码与 OP 发布的代码不同。仔细注意原始代码中预增和预减运算符的使用,以及运算符优先级的影响。分享和享受。
    【解决方案4】:

    声明char *argv[] 是一个指向char 的指针数组(大小未定),也就是一个字符串数组。

    所有数组都会衰减为指针,因此您可以将数组用作指针(就像您可以将指针用作数组一样)。所以*++argv 首先增加“指针”以指向数组argv 中的下一个条目(循环中的第一次将是第一个命令行参数)并取消引用该指针。

    【讨论】:

      【解决方案5】:

      参数声明看起来类似于数组的声明,但实际上(因为它是一个函数参数)它不是一个。 C FAQ 解释得很好。

      【讨论】:

        【解决方案6】:

        argcargv是传递给程序主函数的参数。

        argc 在一个整数中保存参数的数量,argv 是一个指向保存实际参数的字符串数组的指针。 argv 引用的每个元素都用空格分隔。

        【讨论】:

          【解决方案7】:

          这里做的是指针运算。

          指针并没有真正改变。

          指针的地址被使用,暂时递增后用于输出。

          因为操作符++放在argv前面,所以先取地址,再递增,再解引用,得到这个地址后面的char*。

          但改变的不是地址本身,而是 printf 将从中读取的偏移量。

          好的?

          【讨论】:

          • 指针正在被改变,使用了前置增量操作符。但是,你知道,这是 C,而不是一些旨在保护我们免受自身伤害的 namby-pamby 计算机科学语言。你想改变你的过程参数吗?嘿,加油!我们是C!我们很坚强!我们很强!我们是(*$(*&(*#ADDRESS EXCEPTION AT MEMORY LOCATION 0
          • 抱歉来晚了。重量级。我一直认为,这个预增量运算符只是有助于获得“之前的位置”,并且不会真正改变指针本身,这意味着,只是为了在运行时进行访问。好的,我需要再读一遍,我想说(必须承认)。
          猜你喜欢
          • 2011-03-02
          • 2022-06-20
          • 2018-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-10
          相关资源
          最近更新 更多