Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ char*argv[]在c/c++;?_C++_C_Arrays_Pointers - Fatal编程技术网

C++ char*argv[]在c/c++;?

C++ char*argv[]在c/c++;?,c++,c,arrays,pointers,C++,C,Arrays,Pointers,我知道它是用来使用命令行中的参数的,但是我没有得到声明。 字符*argv[]?它是否意味着指向字符数组的指针,如果是,为什么没有大小?如果不是动态数组,您不需要有一个大小吗 我做了一些研究,发现有人说它会腐烂成炭**argv。这个腐烂的东西是怎么工作的 感谢您的帮助-很抱歉成为noob xD传递带有指向数组及其大小的指针的数组并不少见。如果您需要大小来传递指针,那么这是不可能做到的。大小只需要分配数组即可。您有大小argc。虽然您可以在函数签名中使用该语法,但不能真正将数组传递给C++中的函数。

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

我做了一些研究,发现有人说它会腐烂成炭**argv。这个腐烂的东西是怎么工作的


感谢您的帮助-很抱歉成为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
的操作来检索的主要原因). 这就是为什么参数计数(argv
argv
中的元素计数)也以
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。相应更新