(*++argv)[0] 在 K&R2 的这段代码中是如何工作的?

问题描述

这个问题是关于“C 编程语言”K&R2,第 5 章第 5.10 节中某些语法的含义。 117.

在 K&R2 书的本章前面,他们解释了数组的名称是指向其第一个元素的指针;因此,我知道 argv 是指向第一个命令行参数的指针,例如./Exercise5-10

这个程序的while循环中的语法是如何工作的? (*++argv)[0] 我知道获取字符串的第一个字符:argv 自然指向索引 0,即程序名称,并递增到下一个 char* 或字符串,然后使用 {{1} } 并且它的第一个字符是通过 [0] 符号访问的。我只是不明白在内循环中,* 如何解析字符串。

我还往书里看,解释还是不清楚。对我来说,*++argv[0] 首先转到程序名称 argv 中的第 0 个 *++argv[0]。然后它会增加到下一个字符串,char* 或其他任何情况。然后再次取消引用从而导致第一个字符。

我不明白这一点,希望得到更多说明。

-x

解决方法

 while (--argc > 0 && (*++argv)[0] == '-')

“虽然还有一些参数,但下一个参数的第一个字符是破折号(顺便说一下,增加 argv 以指向该参数)”。这隐含地忽略了 argv[0],它是程序名称,因为它做的第一件事是增加 argv 以指向(以前的)argv[1]

while ((c = *++argv[0]))

"虽然 argv[0] 指向的参数中还剩下一些字符(即我们还没有到达空终止符),顺便说一下,增加该指针,但也保存指向的字符为 c”。同样,这会通过在取消引用之前递增来忽略参数的第一个字符(我们已经知道它是 '-')。

switch (c)

对每个标志字符做一些事情。这是使用相当古老的 Unix 标志样式,其中标志具有一个字符的名称,并且 -abc-a -b -c 相同。

此代码就地修改了 argcargv argv 中包含标志的每个元素,这会被认为相当草率和混乱今天,但在 1970 年空间非常宝贵(C 所针对的典型机器可能有几十 KB 的内存,有时甚至更少),并且在您不再需要原件时制作副本被认为有点罪恶。它使程序处于一种状态,其中 argc非标志 参数的数量,而 argv[0] 指向第一个非标志参数。