为什么 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
是指向char
s的指针,而myword
只是一个指针。
myword
是 char*
类型,而 argv
是 char**
.
类型
因为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
是指向指针数组的指针。这些指针指向字符数组。
我正在学习 C++,但我似乎无法找到一个很好的解释是 char* argv[] 是如何工作的。我知道这是一个字符数组,但据我所知,如果你有
char myword[] = "Hello";
那么 myword[1] 就是 "e"。
那么在使用argv[]时,为什么argv[1]是整个第一个参数而不只是程序名的第二个字母?这里有些东西我不明白,但我不确定是什么....
感谢任何解释!
因为argv
是指向char
s的指针,而myword
只是一个指针。
myword
是 char*
类型,而 argv
是 char**
.
因为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
是指向指针数组的指针。这些指针指向字符数组。