C 为什么要声明数组类型的参数?

C 为什么要声明数组类型的参数?,c,arrays,pointers,coding-style,C,Arrays,Pointers,Coding Style,根据“”,这两种声明参数的方法在语义上没有区别,因为“数组参数[正在]被视为它们被声明为指针” 然而,处理数组和指针之间有很大的区别。例如,可以使用sizeof(some_array)来确定数组的大小。不过,在处理指针时,这只会显示指针本身的大小。(旁注:这是一个非常巧妙的解决方案。) 这就是为什么我发现这样声明参数会产生误导:f1(int a[])。正如djechlin在“”中指出的那样,我认为这会诱使人们认为自己实际上是在处理数组而不是指针:“因此我总是喜欢指针形式,因为数组形式可能会引起微

根据“”,这两种声明参数的方法在语义上没有区别,因为“数组参数[正在]被视为它们被声明为指针”

然而,处理数组和指针之间有很大的区别。例如,可以使用
sizeof(some_array)
来确定数组的大小。不过,在处理指针时,这只会显示指针本身的大小。(旁注:这是一个非常巧妙的解决方案。)

这就是为什么我发现这样声明参数会产生误导:
f1(int a[])
。正如djechlin在“”中指出的那样,我认为这会诱使人们认为自己实际上是在处理数组而不是指针:“因此我总是喜欢指针形式,因为数组形式可能会引起微妙的混淆。”

尽管如此,我想知道为什么人们一直使用“数组形式”,因为似乎没有理由这样做。我错过了什么?在他的书中,实际上混合了两种方式:

void print_arguments(int argc, char *argv[]) { /* ... */ }
他们也在K&R2中这样做


为什么??我知道不这样做的原因,但优点是什么?

从技术上讲,我不知道任何原因,但从语义上讲,其含义要清楚得多

如果我看到一个函数带有指向某个对象的指针,我希望它是一个单独的项,除非变量名(和/或可能的函数名)明确表示它将使用数组


然而,如果它被标记为接受一个数组,这是非常明显的。多个
**
的情况尤其如此-以
char*argv[]
为例。这显然是指向
char*
数组(即字符串)的指针
char**argv
可以是这样,但也可以是可变指针(例如用于释放)。虽然
char argv[][]
意味着一个二维数组(有些东西
char*argv[]
并不意味着二维数组)。

虽然两个声明都是相同的,但当您想向数组传递指针时,最好使用第一个声明。这一点很容易理解。

在后一种情况下,不可预测是将指针传递给单个元素还是数组

哪一个更容易理解:

char *argv[] is intended to be an array of pointers to chars

是的,您可以用非直观的方式编写C代码,但为什么要这样做呢

您喜欢哪一种:

a[2]
*(a + 2)
*(2 + a)
2[a]

所有这些都有相同的效果。当它只是语法上的糖分时,为什么要使用
[]
?因为它更具可读性。类似地:
(*ps)。member
的可读性不如
ps->member

数组符号表示意图:指针指向数组,而不是单个元素。
char*argv[]
作为字符串数组很明显
char**argv
写得不太清楚。原因与使用代码缩进和长标识符相同。你知道,它们在语义上没有区别。我不确定你所说的关于
sizeof
的语句是什么意思,但是
sizeof
只给出数组的声明编译时大小。它并没有以有用的方式处理函数参数。@Matt:Butt只是因为你知道
argv
是按照惯例的。否则它将只是一个
char*
数组。
char **argv is a pointer to a pointer to a char
a[2]
*(a + 2)
*(2 + a)
2[a]