我知道这是用来从命令行使用参数的,但是声明我不太理解。char * argv []?这是指向字符数组的指针吗?如果是,为什么没有大小?如果不是动态数组,难道不需要大小吗?
我做了一些研究,听说它会衰变成 char **argv。衰变是如何起作用的呢?
谢谢你的帮助 - 对不起,我是个新手 xD
我知道这是用来从命令行使用参数的,但是声明我不太理解。char * argv []?这是指向字符数组的指针吗?如果是,为什么没有大小?如果不是动态数组,难道不需要大小吗?
我做了一些研究,听说它会衰变成 char **argv。衰变是如何起作用的呢?
谢谢你的帮助 - 对不起,我是个新手 xD
argv
视为指向字符/字符串的指针数组是最好的方法。每个 argv[i]
指向一个以 null 结尾的字符串的开头。argc
来告诉你数组中有多少条目,但这在技术上是多余的,因为 argv[argc] == NULL
,所以你有两种方法来检测参数列表的结尾。int a[10]
传递给一个函数,那么值就是 &a[0]
,并且是一个 int *
。在函数声明或定义中,你可以交替使用 int *x
或 int x[]
。唯一的区别在于,元素类型不是 int
,而是 char *
,因此在函数的声明或定义中,char *argv[]
和 char **argv
是等效的。请注意,这种等价性不适用于局部或全局变量。在 extern char **v;
和 extern char *a[];
之间存在重大差异。命令行参数作为一个数组传递。在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";
常见的做法是传递指向数组及其大小的指针。如果需要大小来传递指针,则无法实现此操作。无论如何,只有在分配数组时才需要大小。
argc
。虽然您可以在函数签名中使用该语法,但在C ++中无法真正将数组传递给函数。它是一个char **
。"这是指向字符数组的指针吗...?"
不是的。char* argv[];
声明了一个字符串数组(一个类型为char *
的指针数组)。
"为什么没有大小?"
因为大小可能会变化,它不是固定的~请注意,这种类型的参数((char*)[]
)等同于char**
,因为数组会衰变成指针(这也是数组大小不能通过像sizeof(argv)/sizeof(char*)
这样的操作来获取的主要原因 - argv
是一个指针)。这就是为什么参数的数量(即argv
中的元素数量)以argc
的形式传递给main函数的原因。
char **
。即使char *argv [10]
也会愉快地允许将不同大小的数组传递给函数。 - Ed S.它是一个包含字符指针的数组。
因此,argv[0]实际上是指向内存区域的指针,其中包含第一个参数(实际上是命令名称)的字符。
在C语言中,数组没有绑定检查 - 数组没有隐式大小。对于argv,可以通过argc告诉参数数量。
要找到argv中每个元素中个别参数的长度,可以利用字符串以空字符结尾的事实。
它“衰减为char ** argv”的说法是指在C语言中数组和指针的近似等价性。在大多数方面,您可以将数组变量视为指向数组中第一个元素的指针。
虽然数组和指针之间存在一些重要的差异,但需要注意一些问题。有关更多深度,请参见this article。