2016-01-21 30 views
0

我正在学习C++,我似乎无法找到一个好的解释是char * argv []的工作原理。我知道这是一个字符数组,但从我的理解,如果你有为什么argv [1]是整个单词而不是单个字母?

char myword[] = "Hello"; 

然后myword [1]是“e”。

所以当使用argv []时,为什么argv [1]是整个第一个参数,而不仅仅是程序名的第二个字母?这里有一些我不明白,但我不知道什么....

感谢您的任何解释!

回答

1

你似乎错过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! + \0 
size_t s_pargv = sizeof(pargv); // equals to whatver size of pointer you have, i.e. 4 or 8 
+0

为了迂回,'argv'是一个指针。但它总是指向一个指针数组 - 它总是指向字符数组。 – user2079303

+0

啊哈!这就说得通了!谢谢! – Matt

+0

@ user2079303,我的确同意这一点,并且我实际上已经考虑过这样的措辞,但是OP会更好地理解'数组'。 – SergeyA

0

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

+1

其实'myword'根本不是'char *'。实际上,它是一个char [6]' – user2079303

+0

@ user2079303无论何时开始在阵列上操作,它都会转换为指针。 –

+0

取决于你如何操作它,但是,在很多情况下,数组会衰减到一个指针。 – user2079303

0

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

char* argv[] 
//^

,而不是

char argv[] 
-2

char* argv[]是双阵列(或任何你想将它命名),同为char** argv。在argv[0]处的对象将是另一个char*,argv[0][0]将是char

+2

不,'argv [0]'处的对象不是数组,而是'char *'。 – SergeyA

0

argv的基本上是这样的:那么在左边

enter image description here

是参数本身 - 什么实际作为参数传递main。这是一个指针数组的地址。每个指向内存中的某个位置的文件都包含在命令行中传递的相应参数的文本。然后,在该数组的末尾保证有一个空指针。

注意,对于个人的实际参数存储在至少可能相互独立分配,使它们在内存中的地址可能是相当随机排列(但取决于事情如何发生的写入,他们可以也在一块连续的记忆中 - 你根本不知道或不应该在意)。

+1

出于好奇 - 你为什么重新排列第三和第二个参数,使图片复杂化? – SergeyA

+4

@SergeyA:为了强调每一个都至少在理论上分开分配的事实,并且你不能指望它们在内存中遵循任何特定的顺序。 –

+0

我明白了。顺便说一下,我更喜欢新的安排。 – SergeyA

0

我明白[argv]是字符

的阵列它不是。它甚至不是一个数组。

C++中没有数组参数,请参阅C++ arrays as function argumentsPassing Arrays to Function in C++。如果在参数声明中使用T[]T[N]语法,则实际上意味着T*。因此, argv是一个指向指针数组的指针。这些指针指向字符数组。

相关问题