4

可能重复:
将数组和数组指针传递给 C 中的函数之间的区别

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

void f1(char *c);
void f2(char c[]);

一个常见的例子是:

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

除了艺术方面的原因之外,还有什么理由更喜欢其中一个吗?

4

4 回答 4

6

没有区别。

从马口:

(C99,6.7.5.3p7)“将参数声明为“类型数组”应调整为“类型限定指针”,其中类型限定符(如果有)是在数组的 [ 和 ] 中指定的限定符类型推导。”

关于偏爱一种形式而不是另一种形式的原因,这取决于人们。这是 H&S 所说的(切换到T *arrayfrom 时T arr[]):

(H&S,5.4.3 Array Bounds)“这将更准确地反映实施,但不太清楚地表明意图。”

于 2012-04-20T14:21:18.473 回答
2

不,在函数声明/定义中,使用数组作为参数只是语法糖。它仍然作为指针传递,并且sizeof(theArgument)仍然会给你sizeof(TheType *)而不是sizeof(TheType) * sizeof(numElements).

于 2012-04-20T14:19:58.343 回答
1

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

于 2012-04-20T14:19:51.013 回答
0

没有区别。C 和 C++ 中的每个 n 维数组都可以解释为 n 维数组和指向 (n-1) 维数组的指针(因为指针的[]语义与数组的语义相同)。

于 2012-04-20T14:20:40.897 回答