可能的重复:
argc 和 argv in main
我很难理解用于一般主函数声明的符号,即int main(int argc, char *argv[])
.我知道实际传递给 main 函数的是指向char
的指针,但我发现符号很难。例如:
为什么**argv
指向第一个字符而不是整个字符串?同样,为什么*argv[0]
指向与前面的示例相同的内容。
为什么*argv
指向整个第一个字符串,而不是像前面的示例那样指向第一个char
?
这有点无关,但是为什么*argv + 1
指向字符串"减去第一个字符"而不是指向数组中的下一个字符串?
考虑一个带有argc == 3
的程序。
argv
|
v
+---------+ +----------------+
| argv[0] |-------->| program name |
+---------+ +-------------+--+
| argv[1] |-------->| argument1 |
+---------+ +-------------+
| argv[2] |-------->| argument2 |
+---------+ +-------------+
| 0 |
+---------+
变量argv
指向指针数组的开头。argv[0]
是第一个指针。 它指向程序名称(或者,如果系统无法确定程序名称,则argv[0]
的字符串将为空字符串;argv[0][0] == ' '
)。argv[1]
指向第一个参数,argv[2]
指向第二个参数,argv[3] == 0
(等效于argv[argc] == 0
)。
当然,您需要了解的另一个细节是任何数组的array[i] == *(array + i)
。
你具体问:
- 为什么 **argv 指向第一个字符而不是整个字符串?
*argv
等同于*(argv + 0)
,因此argv[0]
。 这是一个char *
. 当你取消引用一个char *
时,你会得到字符串中的"第一个"字符。 因此,**argv
等同于*(argv[0])
或*(argv[0] + 0)
或argv[0][0]
。
(可以合理地争辩说,**argv
是一个字符,而不是一个指针,所以它不会"指向第一个字符"。 它只是"program name "
'p'
的另一个名称。
- 同样,为什么 *argv[0] 指向与前面示例相同的内容。
如前所述,argv[0]
是指向字符串的指针;因此*argv[0]
必须是字符串中的第一个字符。
- 为什么
*argv
指向整个第一个字符串,而不是像前面的示例那样指向第一个字符?
这是一个惯例问题。*argv
指向第一个字符串的第一个字符。 如果将其解释为指向字符串的指针,则它指向"整个字符串",就像char *pqr = "Hello worldn";
指向"整个字符串"一样。 如果将其解释为指向单个字符的指针,则它指向字符串的第一个字符。 把它想象成波粒二象性,只是在这里它是字符串二象性。
- 为什么
*argv + 1
指向字符串"减去第一个字符"而不是指向数组中的下一个字符串?
*argv + 1
(*argv) + 1
. 如前所述,*argv
指向第一个字符串的第一个字符。 如果将指针加 1,则指针指向下一项;由于*argv
指向一个字符,因此*argv+1
指向下一个字符。
*(argv + 1)
指向下一个字符串(的第一个字符)。
这一切都归结为指针算术。
*argv[0] = *(*(argv + 0)) = **argv
由于[]
的优先级高于一元*
。
另一方面,*argv
给出了数组中的第一个单元格,一个包含指针的数组。这个指针指向什么?当然,为什么是字符数组,字符串。
*argv + 1
给出它给出的,+
因为它的优先级低于一元*
,所以首先我们得到一个指向字符串的指针,然后我们给它加 1,从而得到一个指针 字符串中的字符。
I understand that what is actually passed to the main function is a pointer to a pointer to char
不,传递的是字符指针数组(字符串数组)。可以这样想,如果我在命令提示符下给出这个:
>> ./program hello 456
我的程序的主要内容将得到:
argc == 3
argv[0] == program (the name of the program as a string)
argv[1] == hello (the first parameter as a string)
argv[2] == 456 (the second parameter as a string)
Why does **argv point to the first char and not the whole string?
char *argv[] //an array of character pointers
*argv // an array decays to a pointer, so this is functionally equivalent to
// argv[0]
**argv // Now the argv[0] decays to a pointer and this is functionally
// equivalent to (argv[0])[0]
Likewise, why does *argv[0] point to the same thing as the previous example.
见上文。
Why does *argv point to the whole first string, instead of the first char like the previous example?
见上文。
这都是因为数组也是指向 c 中数组中第一个元素的指针。**argv
两次取消对指向 char 的指针的引用,从而给我们一个 char。*argv[0]
基本上是说"取消引用该地址,并返回由我们刚刚从取消引用中获得的地址描述的数组中的第一个元素",这恰好是一回事。*argv
只取消引用一次,所以我们仍然有一个指向 char 的指针,或者一个 char 数组。*argv + 1
取消引用一次,给我们第一个字符串,然后在地址上加 1,给我们第二个元素的地址。 因为指针也是数组,我们可以说这是数组*argv
减去第一个元素。