为什么 argv[1] 是一个完整的单词而不是一个字母?

Why is argv[1] an entire word and not a single letter?

我正在学习 C++,但我似乎无法找到一个很好的解释是 char* argv[] 是如何工作的。我知道这是一个字符数组,但据我所知,如果你有

char myword[] = "Hello";

那么 myword[1] 就是 "e"。

那么在使用argv[]时,为什么argv[1]是整个第一个参数而不只是程序名的第二个字母?这里有些东西我不明白,但我不确定是什么....

感谢任何解释!

因为argv是指向chars的指针,而myword只是一个指针。 mywordchar* 类型,而 argvchar**.

类型

因为argv(假设你的意思是声明为main()参数的那个)是

char* argv[]
 // ^

而不是

char argv[]

您似乎忽略了一点,即 argv(如 int main(int argc, char* argv[]) 中)是指向 char 的指针,而不是 char。

关于数组和指针的一些有趣的东西。由于指针可以被视为数组(前提是它指向数组)并且数组可以被视为指针(技术术语是衰减到指针)数组和指针可以是经常互换使用。

然而,在这样做时,仍然需要记住,在某些时候,数组和指针之间存在明显的区别。最明显的(不是唯一的!)之一是它们的大小差异。

例如:

char argv[] = "Test!";
char* pargv = argv;

size_t s_argv = sizeof(argv); // equals to 6 - 5 letters of Test! + [=10=]
size_t s_pargv = sizeof(pargv); // equals to whatver size of pointer you have, i.e. 4 or 8

char* argv[] 是一个双精度数组(或者随便你怎么称呼它),和 char** argv 一样。 argv[0] 处的对象将是另一个 char*argv[0][0] 将是 char

argv 基本上是这样的:

所以左边是参数本身——实际作为参数传递给 main 的内容。那是指针数组的地址。这些中的每一个都指向内存中的某个位置,其中包含在命令行上传递的相应参数的文本。然后,在该数组的末尾,保证是一个空指针。

请注意,各个参数的实际存储空间至少可能彼此分开分配,因此它们在内存中的地址可能会相当随机地排列(但取决于事情的编写方式,它们 可以也可以在一个连续的内存块中——你根本不知道或者也不应该关心)。

I understand that [argv] is an array of characters

不是。它甚至不是一个数组。

C++ 中没有数组参数,参见例如C++ arrays as function arguments and Passing Arrays to Function in C++T[]T[N] 语法,如果在参数声明中使用,实际上意味着 T*.

所以, argv 是指向指针数组的指针。这些指针指向字符数组。