char * argv []如何在c / c ++中工作?

时间:2014-01-29 06:48:50

标签: c++ c arrays pointers

我知道它用于从命令行使用参数,但我没有得到声明。 char * argv []?它是指一个指向char数组的指针,如果是这样,为什么没有大小?如果它不是动态数组,你不必有一个大小吗?

我做了一些研究,遇到人们说它衰败到char ** argv。这种腐烂的东西是如何起作用的?

感谢您的帮助 - 对不起是一个noob xD

6 个答案:

答案 0 :(得分:3)

查看argv的最佳方式是作为字符/字符串指针的数组。每个argv[i]指向一个字符,该字符是以空字符结尾的字符串的开头。

您被传递argc以告诉您阵列中有多少条目,但这在技术上是多余的,因为argv[argc] == NULL,所以您有两种方法可以检测参数列表的结尾。

衰变'事物'是当你将一个数组传递给一个函数时,它被视为指向数组第一个元素的指针。

因此,如果您将int a[10]传递给某个函数,则该值为&a[0]且为int *。在函数声明或定义中,您可以互换地编写int *xint x[]。这与argv之间的唯一区别是元素类型不是int而是char *,因此char *argv[]char **argv在声明或定义中是等效的一个功能。请注意,此等效性不适用于局部变量或全局变量。 extern char **v;extern char *a[];之间存在重大差异。

答案 1 :(得分:1)

传递一个带有指向数组及其大小的指针的数组并不罕见。如果你需要传递指针的大小,那么这是不可能的。无论如何只需要分配数组。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

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

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

答案 4 :(得分:1)

“它是指一个指向char数组的指针......?”

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

“为什么没有尺寸?”

因为大小可能会有所不同,所以不固定〜请注意,这种类型的参数((char*)[])等同于char**,因为数组会衰减为指针(这是大小的主要原因)只需执行sizeof(argv)/sizeof(char*)之类的操作就无法检索数组 - argv是一个指针)。这就是为什么参数计数(argv中的元素数)也以argc的形式传递给main的原因。

答案 5 :(得分:1)

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

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

在C中,未绑定数组 - 数组没有隐式大小。在argv的情况下,您可以通过argc告诉参数的数量。

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

它'衰变为char ** argv'的陈述指的是C中数组和指针的近似等价。在大多数情况下,您可以将数组变量视为指向数组中第一个元素的指针。

但是,数组和指针之间存在一些重要的区别,因此需要谨慎。有关更深入的信息,请参阅this article