Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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
Arrays char argv[][]作为主函数参数,为什么不呢?_Arrays_C_Pointers_Arguments - Fatal编程技术网

Arrays char argv[][]作为主函数参数,为什么不呢?

Arrays char argv[][]作为主函数参数,为什么不呢?,arrays,c,pointers,arguments,Arrays,C,Pointers,Arguments,我从一个在线课程中学到,char**argv和char*argv[]都可以用作main的参数 我也知道它们实际上是相同的,它们都将argv声明为“指向char指针(char*)的指针(char*)” 是什么使得char argv[][]作为main的参数无效 编辑:实际上,char*argv[]是否声明数组而不是指针?因此,argv只衰减为一个指针,而不是指针本身?如果使用char argv[][],则认为每个单词都有相同数量的字母。每个argv[i]都指向另一个char*,但是,这个全新的ch

我从一个在线课程中学到,
char**argv
char*argv[]
都可以用作
main
的参数

我也知道它们实际上是相同的,它们都将argv声明为“指向char指针(
char*
)的指针(
char*
)”

是什么使得
char argv[][]
作为
main
的参数无效


编辑:实际上,
char*argv[]
是否声明数组而不是指针?因此,argv只衰减为一个指针,而不是指针本身?

如果使用
char argv[][]
,则认为每个单词都有相同数量的字母。每个argv[i]都指向另一个
char*
,但是,这个全新的
char*
不需要所有字符都是相同的大小


此外,如果使用
char argv[][]
运行代码,编译器可能会显示一个错误:“将'argv'声明为多维数组必须对除第一个维度以外的所有维度具有边界”。事实上,
int argc
参数包含传递的参数量,即分配的字符数*。但是,没有任何关于先前分配到的每个字符*的大小的信息。

如果使用
char argv[][][]
,则认为每个单词都有相同数量的字母。每个argv[i]都指向另一个
char*
,但是,这个全新的
char*
不需要所有字符都是相同的大小


此外,如果使用
char argv[][]
运行代码,编译器可能会显示一个错误:“将'argv'声明为多维数组必须对除第一个维度以外的所有维度具有边界”。事实上,
int argc
参数包含传递的参数量,即分配的字符数*。但是,没有任何关于先前分配给的每个字符*的大小的信息。

此参数声明

char argv[ ][ ]
无效,因为编译器需要知道数组的元素类型,该数组在本例中为不完整类型
char[]

本声明

char *argv[ ] 
char **argv
T a[N];
声明元素类型为
char*
的不完整数组类型

如果这样一个声明被用作函数参数声明,那么编译器会隐式地将其调整为指向该声明的元素类型的指针

char *argv[ ] 
char **argv
T a[N];

这是一个参数的声明

char argv[ ][ ]
无效,因为编译器需要知道数组的元素类型,该数组在本例中为不完整类型
char[]

本声明

char *argv[ ] 
char **argv
T a[N];
声明元素类型为
char*
的不完整数组类型

如果这样一个声明被用作函数参数声明,那么编译器会隐式地将其调整为指向该声明的元素类型的指针

char *argv[ ] 
char **argv
T a[N];

有点像杂草:

6.7.6.2数组声明器 …
1除了可选的类型限定符和关键字
static
[
]
可以限定 表达式或
*
。如果它们分隔表达式(指定数组大小),则 表达式应为整数类型。如果表达式是常数表达式,则应 具有大于零的值元件类型不得为不完整或功能 键入。可选类型限定符和关键字
static
只能出现在 声明具有数组类型的函数参数,然后仅在最外层 数组类型派生。

4如果大小不存在,则数组类型为不完整类型。如果尺寸为
*
而不是 作为一个表达式,数组类型是一个未指定大小的可变长度数组类型, 只能在具有函数原型作用域的声明或类型名中使用143) 尽管如此,这样的数组仍然是完整的类型。如果大小是整数常量表达式 并且元素类型具有已知的常量大小,数组类型不是可变长度 数组类型;否则,数组类型为可变长度数组类型。(可变长度 阵列是实现不需要支持的条件功能;请参阅6.10.8.3。)

6.7.6.3函数声明器(包括原型)

4调整后,函数声明器中参数类型列表中的参数 该函数的部分定义不应具有不完整的类型。

7将参数声明为“类型数组”应调整为“指向 类型“”,其中类型限定符(如果有)是在 数组类型派生。如果关键字
static
也出现在 数组类型派生,然后为每个函数调用 实际参数应提供对数组的第一个元素的访问,该元素至少具有相同的数量 由大小表达式指定的元素。 因此,要解开所有这些:

char argv[];
argv
声明为大小未知的
char
数组。此类型是不完整的,因此我们无法使用以下内容创建它的数组

char argv[][N];
通过扩展,我们不能创建该元素类型的未知大小的数组:

char argv[][];
“但是,”我听到你说,“一个
char[]
类型的参数被调整为
char*
,那么为什么
char[][]
不等于
char**
?”

因为这不是数组衰减的工作方式。让我们从一个通用数组声明开始

char *argv[ ] 
char **argv
T a[N];
a
的类型是“T的N元素数组”,在大多数上下文中(包括作为函数参数),其类型被转换(“衰减”)或“调整”为“指向<