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

Posted

技术标签:

【中文标题】char* argv[] 如何在 c/c++ 中工作? [复制]【英文标题】:how does char* argv[] work in c/c++? [duplicate] 【发布时间】:2014-02-20 20:07:34 【问题描述】:

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

我做了一些研究,发现有人说它会衰减为 char **argv。这个腐烂的东西是如何工作的?

感谢您的帮助 - 很抱歉成为菜鸟 xD

【问题讨论】:

发帖前请使用search。互联网、书籍,甚至 *** 都已经有了这个问题的答案。至少看看at this。 【参考方案1】:

查看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[]; 之间存在重大差异。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

命令行参数作为数组传递。 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";

【讨论】:

【参考方案5】:

"是不是指一个指向 char 数组的指针...?"

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

“为什么没有尺寸?”

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

【讨论】:

要挑剔(排序),您不能将数组传递给函数。如果您愿意,可以使用该语法,但它仍然是char**。甚至char *argv[10] 也很乐意允许将不同大小的数组传递给函数。 @EdS.:正在腐烂……我知道,我知道……:D 我想你知道,但是初学者对此有很多问题,我认为最好澄清一下 嘿,是的。在关于 C 或 C++ 数组的线程中,我总是觉得自己像个书呆子【参考方案6】:

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

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

在 C 中,数组没有被绑定检查 - 数组没有隐式大小。对于 argv,您可以通过 argc 知道参数的数量。

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

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

不过,数组和指针之间有一些重要的区别,因此需要注意。例如,请参阅 this article 以获得更多深度。

【讨论】:

我觉得这里的cmets中的工具太挑剔了,但是……“因此,argv[0]实际上是一个指向字符数组的指针” -它不是。它是指向 char (char*) 的指针,而不是指向 char 数组的指针 (char (*)[]) 感谢@EdS。相应更新

以上是关于char* argv[] 如何在 c/c++ 中工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C语言 main 函数参数 main(int argc, char *argv[])

方括号如何在 C 中工作?

typedef 重新定义如何在 C11 中工作?

C语言如何在编写的程序中插入图片

Main函数传参

C++ 将 char * 转换为 unsigned char