C 这两种声明之间有什么区别吗?

C 这两种声明之间有什么区别吗?,c,C,可能重复: 我一直在想,这两者之间有什么区别吗 void f1(char *c); void f2(char c[]); 一个常见的例子是: int main(int argc, char **argv); int main(int argc, char *argv[]); 除了艺术上的原因外,还有什么原因让我们更喜欢一个呢?第一个原因表明这是指针,第二个原因表明这是数组。虽然没有有效的区别,但当您阅读代码时,通常期望第一种情况下只有一个元素,而第二种情况下则是一个多元素的序列。这有时可能

可能重复:

我一直在想,这两者之间有什么区别吗

void f1(char *c);
void f2(char c[]);
一个常见的例子是:

int main(int argc, char **argv);
int main(int argc, char *argv[]);

除了艺术上的原因外,还有什么原因让我们更喜欢一个呢?

第一个原因表明这是指针,第二个原因表明这是数组。虽然没有有效的区别,但当您阅读代码时,通常期望第一种情况下只有一个元素,而第二种情况下则是一个多元素的序列。这有时可能会有所帮助。

否。在函数声明/定义中,使用数组作为参数仅在语法上起作用。它仍然是作为指针传递的,
sizeof(theArgument)
仍然会为您提供
sizeof(TheType*)
,而不是
sizeof(TheType)*sizeof(numElements)
没有区别。C和C++中的每个n维数组都可以解释为n维数组和指向(n-1)维数组的指针(指针的<代码> []/COD>语义与数组的相同)。 从马嘴里说:

(C99,6.7.5.3p7)“作为“类型数组”的参数声明应调整为“类型限定指针”,其中类型限定符(如有)是数组类型派生的[and]中指定的类型限定符。”

选择一种形式而不是另一种形式的原因取决于人们。以下是H&S所说的(从
T arr[]
切换到
T*array
):

(H&S,5.4.3数组边界)“这将更准确地反映实现,但不太清楚地表明意图。”


谁是H&S?谷歌对这么短的查询没有多大帮助。Harbison&Steele。谢谢。你能推荐给我吗?(我现在是C的中级)总的来说,这是C最好的一本书。请注意,这是一本参考书。