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元素数组”,在大多数上下文中(包括作为函数参数),其类型被转换(“衰减”)或“调整”为“指向<