可能重复:
将数组和数组指针传递给 C 中的函数之间的区别
我一直在想这个问题,这两者之间有什么区别吗?
void f1(char *c);
void f2(char c[]);
一个常见的例子是:
int main(int argc, char **argv);
int main(int argc, char *argv[]);
除了艺术方面的原因之外,还有什么理由更喜欢其中一个吗?
可能重复:
将数组和数组指针传递给 C 中的函数之间的区别
我一直在想这个问题,这两者之间有什么区别吗?
void f1(char *c);
void f2(char c[]);
一个常见的例子是:
int main(int argc, char **argv);
int main(int argc, char *argv[]);
除了艺术方面的原因之外,还有什么理由更喜欢其中一个吗?
没有区别。
从马口:
(C99,6.7.5.3p7)“将参数声明为“类型数组”应调整为“类型限定指针”,其中类型限定符(如果有)是在数组的 [ 和 ] 中指定的限定符类型推导。”
关于偏爱一种形式而不是另一种形式的原因,这取决于人们。这是 H&S 所说的(切换到T *array
from 时T arr[]
):
(H&S,5.4.3 Array Bounds)“这将更准确地反映实施,但不太清楚地表明意图。”
不,在函数声明/定义中,使用数组作为参数只是语法糖。它仍然作为指针传递,并且sizeof(theArgument)
仍然会给你sizeof(TheType *)
而不是sizeof(TheType) * sizeof(numElements)
.
那么第一个表示这是一个指针,第二个表示这是一个数组。虽然没有有效的区别,但当您阅读代码时,您通常期望在第一种情况下是单个元素,而在第二种情况下是一个多于一个元素的序列。这有时可能会有所帮助。
没有区别。C 和 C++ 中的每个 n 维数组都可以解释为 n 维数组和指向 (n-1) 维数组的指针(因为指针的[]
语义与数组的语义相同)。