5

可能重复:
argc 和 argv 在 main

我很难理解用于一般主函数声明的符号,即int main(int argc, char *argv[]). 我知道实际上传递给 main 函数的是一个指向 的指针char,但我发现符号很困难。例如:

为什么**argv指向第一个字符而不是整个字符串?同样,为什么*argv[0]指向与前面的示例相同的内容。

为什么*argv指向整个第一个字符串,而不是char像前面的例子那样指向第一个?

这有点不相关,但为什么*argv + 1指向一个字符串“减去第一个字符”而不是指向数组中的下一个字符串?

4

4 回答 4

11

考虑一个带有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)指向下一个字符串的(第一个字符)。

于 2012-11-13T15:30:47.683 回答
3

这一切都归结为指针算术。

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

由于[]具有比一元更高的优先级*

另一方面,*argv给出数组中的第一个单元格,一个包含指针的数组。这个指针指向什么?为什么是一个 char 数组,一个字符串,当然。

*argv + 1给出它给出的值,因为+它的优先级低于 unary *,所以首先我们得到一个指向字符串的指针,然后给它加 1,从而得到字符串中第二个字符的指针。

于 2012-11-13T15:18:26.620 回答
2

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?

往上看。

于 2012-11-13T15:34:17.113 回答
-1

这都是因为数组也是指向 c 中数组中第一个元素的指针。 **argv两次取消引用指向 char 的指针,给我们一个 char。 *argv[0]基本上是在说“取消引用该地址,并返回我们刚刚从取消引用中获得的地址所描述的数组中的第一个元素”,这恰好是同一件事。 *argv只取消引用一次,所以我们仍然有一个指向 char 或 char 数组的指针。 *argv + 1解引用一次,给我们第一个字符串,然后给地址加 1,给我们第二个元素的地址。因为指针也是数组,我们可以说这是数组*argv减去第一个元素。

于 2012-11-13T15:19:52.973 回答