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 *x
或int 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++ 中工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章