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

时间:2012-04-20 14:18:19

标签: c

  

可能重复:
  Difference between passing array and array pointer into function in C

我一直想知道这一点,这两者有什么不同吗?

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

一个常见的例子就是:

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

除了艺术之外,有没有理由更喜欢彼此?

4 个答案:

答案 0 :(得分:6)

没有区别。

从马口:

  

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

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

  

(H& S,5.4.3阵列边界)“这将更准确地反映实施情况,但不太清楚地表明意图。”

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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