【发布时间】:2016-01-21 18:18:34
【问题描述】:
我正在学习 c++,但我似乎找不到一个很好的解释,那就是 char* argv[] 的工作原理。我知道这是一个字符数组,但据我所知,如果你有
char myword[] = "Hello";
那么 myword[1] 是“e”。
那么在使用 argv[] 时,为什么 argv[1] 是整个第一个参数,而不仅仅是程序名称的第二个字母?这里有一些我不明白但我不确定是什么......
感谢您的任何解释!
【问题讨论】:
我正在学习 c++,但我似乎找不到一个很好的解释,那就是 char* argv[] 的工作原理。我知道这是一个字符数组,但据我所知,如果你有
char myword[] = "Hello";
那么 myword[1] 是“e”。
那么在使用 argv[] 时,为什么 argv[1] 是整个第一个参数,而不仅仅是程序名称的第二个字母?这里有一些我不明白但我不确定是什么......
感谢您的任何解释!
【问题讨论】:
您似乎忽略了 argv(如 int main(int argc, char* argv[]) 中的)是指向 char 的指针,而不是 char 的指针。
关于数组和指针的一些有趣的东西。由于指针可以被视为一个数组(前提是它指向一个数组)并且数组可以被视为指针(对此的技术术语是decay to pointers)一个数组和指针可以经常混合使用.
但是,这样做时,仍然需要记住,在某些时候,数组和指针之间存在明显的区别。最明显的一个(不是唯一一个!)是它们的大小差异。
例如:
char argv[] = "Test!";
char* pargv = argv;
size_t s_argv = sizeof(argv); // equals to 6 - 5 letters of Test! + \0
size_t s_pargv = sizeof(pargv); // equals to whatver size of pointer you have, i.e. 4 or 8
【讨论】:
argv 是一个指针。但它总是指向一个指针数组——而指针又总是指向字符数组。
argv[0] 不是数组而是指针很有趣,因为这与说argv 本身是一个数组一样正确(或不正确)。
因为argv 是指向chars 的指针,而myword 只是一个指针。
myword 是 char* 类型,而 argv 是 char** 类型。
【讨论】:
myword 根本不是char*。其实是char[6]
因为argv(假设您的意思是声明为main() 参数的那个)是
char* argv[]
// ^
而不是
char argv[]
【讨论】:
【讨论】:
我知道 [
argv] 是一个字符数组
不是。它甚至不是一个数组。
C++ 中没有数组参数,参见例如C++ arrays as function arguments 和 Passing Arrays to Function in C++。 T[] 和 T[N] 语法,如果在参数声明中使用,实际上表示 T*。
所以,
argv 是指向指针数组的指针。这些指针指向字符数组。
【讨论】:
char* argv[] 是一个双精度数组(或任何你想称呼它的名称),与char** argv 相同。 argv[0] 处的对象将是另一个 char*,argv[0][0] 将是 char。
【讨论】:
argv[0] 的对象不是数组,而是char*。