考虑一个带有argc == 3
.
argv
|
v
+---------+ +----------------+
| argv[0] |-------->| program name\0 |
+---------+ +-------------+--+
| argv[1] |-------->| argument1\0 |
+---------+ +-------------+
| argv[2] |-------->| argument2\0 |
+---------+ +-------------+
| 0 |
+---------+
该变量argv
指向指针数组的开头。 argv[0]
是第一个指针。它指向程序名称(或者,如果系统无法确定程序名称,则字符串 forargv[0]
将为空字符串;argv[0][0] == '\0'
)。 argv[1]
指向第一个参数,argv[2]
指向第二个参数,和argv[3] == 0
(等价argv[argc] == 0
)。
当然,您需要知道的另一个细节是array[i] == *(array + i)
任何数组的细节。
你具体问:
- 为什么 **argv 指向第一个字符而不是整个字符串?
*argv
等价于*(argv + 0)
并且因此argv[0]
。它是一个char *
. 当您取消引用 achar *
时,您将获得字符串中的“第一个”字符。因此**argv
等价于*(argv[0])
or*(argv[0] + 0)
或argv[0][0]
。
(可以合理地争论 that**argv
是一个字符,而不是一个指针,因此它不会“指向第一个字符”。它只是'p'
of 的另一个名称"program name\0"
。)
- 同样,为什么 *argv[0] 指向与前一个示例相同的东西。
如前所述,argv[0]
是一个指向字符串的指针;因此*argv[0]
必须是字符串中的第一个字符。
- 为什么
*argv
指向整个第一个字符串,而不是像前面的例子那样指向第一个字符?
这是一个约定俗成的问题。 *argv
指向第一个字符串的第一个字符。如果将其解释为指向字符串的指针,则它指向“整个字符串”,与char *pqr = "Hello world\n";
指向“整个字符串”的方式相同。如果将其解释为指向单个字符的指针,则它指向字符串的第一个字符。把它想象成波粒二象性,只是这里是字符串二象性。
- 为什么
*argv + 1
指向一个字符串“减去第一个字符”而不是指向数组中的下一个字符串?
*argv + 1
是(*argv) + 1
。如前所述,*argv
指向第一个字符串的第一个字符。如果给一个指针加1,它就指向下一项;因为*argv
指向一个字符,所以*argv+1
指向下一个字符。
*(argv + 1)
指向下一个字符串的(第一个字符)。