C/C++中 char* argv[] 的工作原理是什么?

3

我知道这是用来从命令行使用参数的,但是声明我不太理解。char * argv []?这是指向字符数组的指针吗?如果是,为什么没有大小?如果不是动态数组,难道不需要大小吗?

我做了一些研究,听说它会衰变成 char **argv。衰变是如何起作用的呢?

谢谢你的帮助 - 对不起,我是个新手 xD


3
请在发布问题之前使用“搜索”功能。互联网、书籍,甚至stackoverflow上已经有了这个问题的答案。请至少查看一下这个链接:https://dev59.com/JXA75IYBdhLWcg3w794Y - Victor Polevoy
6个回答

4
argv 视为指向字符/字符串的指针数组是最好的方法。每个 argv[i] 指向一个以 null 结尾的字符串的开头。
你会收到 argc 来告诉你数组中有多少条目,但这在技术上是多余的,因为 argv[argc] == NULL,所以你有两种方法来检测参数列表的结尾。
衰变的“事情”是,当你将一个数组传递给函数时,它被视为数组的第一个元素的指针。
因此,如果你将 int a[10] 传递给一个函数,那么值就是 &a[0],并且是一个 int *。在函数声明或定义中,你可以交替使用 int *xint x[]。唯一的区别在于,元素类型不是 int,而是 char *,因此在函数的声明或定义中,char *argv[]char **argv 是等效的。请注意,这种等价性不适用于局部或全局变量。在 extern char **v;extern char *a[]; 之间存在重大差异。

1

命令行参数作为一个数组传递。在C和C++中,数组只是一个连续的内存块,它们没有边界检查或声明大小(就像Java中的.length和.NET中的.Length)。

argv是指向字符串数组的指针。这是char**char* argv[],具体取决于使用的语法。 argc是数组的大小。

因为C/C++中的指针始终是固定大小的,所以数组的大小始终是argc个元素,或sizeof(void*) * argc字节。

C/C++中的(基本)字符串数组实际上是char**,因为它是一个指向以空字符结尾的字符串的第一个字符的指针数组,如下所示:

char** stringArray = &{
    0x1234,
    0x4567,
    0xABCD,
}
0x1234 = &"Some string\0";
0x4567 = &"Another string\0";
0xABCD = &"Third string\0";

1

常见的做法是传递指向数组及其大小的指针。如果需要大小来传递指针,则无法实现此操作。无论如何,只有在分配数组时才需要大小。


1
你有大小;argc。虽然您可以在函数签名中使用该语法,但在C ++中无法真正将数组传递给函数。它是一个char **

1

"这是指向字符数组的指针吗...?"

不是的。char* argv[]; 声明了一个字符串数组(一个类型为char *的指针数组)。

"为什么没有大小?"

因为大小可能会变化,它不是固定的~请注意,这种类型的参数((char*)[])等同于char**,因为数组会衰变成指针(这也是数组大小不能通过像sizeof(argv)/sizeof(char*)这样的操作来获取的主要原因 - argv是一个指针)。这就是为什么参数的数量(即argv中的元素数量)以argc的形式传递给main函数的原因。


有点挑剔(有点),你不能将数组传递给函数。如果您喜欢,可以使用该语法,但它仍然是char **。即使char *argv [10]也会愉快地允许将不同大小的数组传递给函数。 - Ed S.
@EdS.:衰减中...我知道,我知道... :D - LihO
我想你已经知道了,但是有很多初学者对此有很多问题,所以我认为澄清一下会很好。 - Ed S.
嘿,是啊。每次在关于C或C++数组的讨论中,我总是感觉自己像个学究式的笨蛋。 - Ed S.

1

它是一个包含字符指针的数组。

因此,argv[0]实际上是指向内存区域的指针,其中包含第一个参数(实际上是命令名称)的字符。

在C语言中,数组没有绑定检查 - 数组没有隐式大小。对于argv,可以通过argc告诉参数数量。

要找到argv中每个元素中个别参数的长度,可以利用字符串以空字符结尾的事实。

它“衰减为char ** argv”的说法是指在C语言中数组和指针的近似等价性。在大多数方面,您可以将数组变量视为指向数组中第一个元素的指针。

虽然数组和指针之间存在一些重要的差异,但需要注意一些问题。有关更多深度,请参见this article


我觉得在这里对注释如此挑剔感觉自己像一个工具,但是……“因此,argv[0]实际上是字符数组的指针”——它不是。它是char类型的指针(char ),而不是字符数组的指针(char () [])。 - Ed S.
感谢 @EdS。已相应更新。 - harmic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接