C++ char*argv[]在c/c++;?
我知道它是用来使用命令行中的参数的,但是我没有得到声明。 字符*argv[]?它是否意味着指向字符数组的指针,如果是,为什么没有大小?如果不是动态数组,您不需要有一个大小吗 我做了一些研究,发现有人说它会腐烂成炭**argv。这个腐烂的东西是怎么工作的C++ char*argv[]在c/c++;?,c++,c,arrays,pointers,C++,C,Arrays,Pointers,我知道它是用来使用命令行中的参数的,但是我没有得到声明。 字符*argv[]?它是否意味着指向字符数组的指针,如果是,为什么没有大小?如果不是动态数组,您不需要有一个大小吗 我做了一些研究,发现有人说它会腐烂成炭**argv。这个腐烂的东西是怎么工作的 感谢您的帮助-很抱歉成为noob xD传递带有指向数组及其大小的指针的数组并不少见。如果您需要大小来传递指针,那么这是不可能做到的。大小只需要分配数组即可。您有大小argc。虽然您可以在函数签名中使用该语法,但不能真正将数组传递给C++中的函数。
感谢您的帮助-很抱歉成为noob xD传递带有指向数组及其大小的指针的数组并不少见。如果您需要大小来传递指针,那么这是不可能做到的。大小只需要分配数组即可。您有大小<代码>argc。虽然您可以在函数签名中使用该语法,但不能真正将数组传递给C++中的函数。它是一个
char**
命令行参数作为数组传递。C和C++中的数组只是一个连续的内存块,它们不带有边界检查或声明大小(如java中的代码>长度> <代码>和.NET <代码>长度>代码>
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";
“它是否表示指向字符数组的指针…”
编号char*argv[]
声明字符串数组(类型为char*
的指针数组)
“为什么没有尺码?”
因为大小可能不同,所以它不是固定的~请注意,这种类型的参数(
(char*)[]
)相当于char**
,因为数组会衰减为指针(这是数组的大小无法通过执行类似sizeof(argv)/sizeof(char*)
-argv
的操作来检索的主要原因). 这就是为什么参数计数(argvargv
中的元素计数)也以argc
的形式传递给main的原因。它是一个包含字符指针的数组
因此,argv[0]实际上是指向包含第一个参数(实际上是命令名)的字符的内存区域的指针
在C语言中,数组并没有绑定检查——数组并没有隐含的大小。在argv的情况下,您可以通过argc知道参数的数量
要查找argv的每个元素中各个参数的长度,可以使用字符串以空字符结尾这一事实
它“衰减为char**argv”的语句指的是C中数组和指针的近似等价性。在大多数情况下,可以将数组变量视为指向数组中第一个元素的指针
不过,数组和指针之间有一些重要的区别,因此需要注意。查看示例了解更多深度。查看
argv
的最佳方式是将指针数组作为字符/字符串。每个argv[i]
都指向一个字符,该字符是以null结尾的字符串的开头
传递给您的是argc
,告诉您数组中有多少个条目,但这在技术上是多余的,因为argv[argc]==NULL
,所以有两种方法可以检测参数列表的结尾
衰变的“东西”是,当您将数组传递给函数时,它被视为指向数组第一个元素的指针
因此,如果将
inta[10]
传递给函数,则该值为&a[0]
且为int*
。在函数声明或定义中,您可以互换地编写int*x
或int x[]
。这与argv
之间的唯一区别在于元素类型不是int
,而是char*
,因此char*argv[]
和char**argv
在函数的声明或定义中是等价的。请注意,这种等价性不适用于局部或全局变量。extern char**v之间存在重大差异代码>和外部字符*a[]代码>在这里发布之前,请使用搜索。互联网,书籍,甚至网络,已经有了这个问题的答案。至少看一看。为了挑剔(sorta),您不能将数组传递给函数。如果愿意,可以使用该语法,但它仍然是char**
。即使是char*argv[10]
也会很高兴地允许将不同大小的数组传递给函数。@EdS.:Decaying。。。我知道,我知道…:我想你知道,但是初学者对此有很多问题,我想澄清一下是的。我总是觉得像一个迂腐的线程在C或C++ + ARRaySI的感觉就像一个工具在这里的评论是如此挑剔,但…“因此,argv[0]实际上是一个指向字符数组的指针”——事实并非如此。它是指向字符(char*
)的指针,而不是指向字符数组(char(*)[]
)的指针,谢谢@EdS。相应更新