【问题标题】:Understanding argv and *++argv[0]了解 argv 和 *++argv[0]
【发布时间】:2014-09-22 04:58:15
【问题描述】:

K&R 的 C 书的第 5.10 章 中引入了 argv 的想法,以允许命令行参数。

argv 是一个指向字符指针数组的指针。考虑到这一点,以下代码如何检查提供的参数是否以连字符开头?

(*++argv)[0] == '-'

据我了解,[0]*(argv + 0) 相同,所以如果我取( *++argv) 的值,然后将其与*(argv + 0) 结合起来,我实际上会得到什么?

我知道它返回参数字符串的第一个字符,但是如何呢?据我了解:

  1. (*++argv) - 检索到 argv 指向的值(它给出了另一个指针)
  2. [0]*(argv + 0) - 然后从该语句返回指向下一个参数指针的下一个指针。
  3. 我看不出参数的第一个字符是如何从这个语句中获得的。

【问题讨论】:

  • argv[0]*(argv + 0) 相同。但是你没有argv[0]。你有(*++argv)[0],所以它是*(*++argv + 0)
  • @chris 你是如何“组合” (*++argv) 和 [0] 来生成 *(*++argv + 0) 的?您能否分步进行,以便我理解推导?
  • X[Y] 等价于*(X + Y)。 X 是(*++argv),Y 是0。 X 周围的括号在转换后是多余的。

标签: c pointers command-line-arguments argv


【解决方案1】:

为了清楚起见,让我们分开++

argv = argv + 1;

那么我们有:

(*argv)[0] == '-'

(我假设这出现在 if 语句中)。

请记住p[0] 的定义是*(p+0),即*p。所以这和argv[0][0] == '-'是一样的。

argv[0] 是一个char *,它指向字符串的第一个字符。所以argv[0][0] 是该字符串的第一个字符。

argv = argv + 1; 的作用是使argv 指向下一个char *,在内存中直接跟在上一个之后。

argv 是指向char * 的事物(它本身不是char *)。相邻内存中有一些char *,每个都指向位于内存中其他位置的字符串。使用argv,您可以遍历char * 的列表。

【讨论】:

  • 使用++argv表示会在while循环中使用; argv 被循环中 ++ 的每个应用程序推进。此外,将 ++ 作为前缀而不是后缀会将其初始化为第二个元素,这是第一个选项(第一个元素是程序名称)。
猜你喜欢
  • 2011-01-02
  • 2015-01-10
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 2021-11-09
相关资源
最近更新 更多