理解argv和* ++ argv [0]

3

从 K&R 的 C 书的第 5.10 章节中介绍了 argv 的概念,以允许命令行参数。

argv 是指向字符指针数组的指针。基于此,以下代码如何检查提供的参数是否以连字符开头?

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

据我所知,[0]*(argv + 0)是相同的,因此,如果我获取(*++argv)的值,并将其与*(argv + 0)相结合,我实际上得到了什么?
我知道它返回参数字符串的第一个字符,但是怎么做呢?据我理解:
  1. (*++argv) - 检索指针argv指向的值(这会给出另一个指针)
  2. [0]*(argv + 0) - 然后从此语句返回下一个指向下一个参数的指针。
  3. 我不明白如何从该语句中获取参数的第一个字符。

2
argv[0] 相当于 *(argv + 0)。但是你没有 argv[0]。你有 (*++argv)[0],所以它是 *(*++argv + 0) - chris
@chris,你是如何将 (*++argv) 和 [0] “组合”起来得到 (++argv + 0) 的?能否逐步讲解一下,以便我理解推导过程? - CS Student
1
X[Y] 相当于 *(X + Y)。其中 X 为 (*++argv),Y 为 0。在转换后,X 周围的括号是多余的。 - chris
1个回答

3

为了更加清晰,我们把++分开来看:

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前进。此外,将++作为前缀而不是后缀将其初始化为第二个元素,即第一个选项(第一个元素是程序名称)。 - Paul Richter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接