2012-04-20 74 views
4

可能重复:
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[]); 

是否有任何理由喜欢一个到另一个,除了艺术的?

+1

http://stackoverflow.com/questions/5573310/difference-between-passing-array-and-array-pointer-into-function-in-c – chepner 2012-04-20 14:20:39

回答

6

没有区别。

从马口:

(C99,6.7.5.3p7)类型的数组“的参数作为的声明‘’应被调整为‘合格指针输入’,其中类型限定符(如果有的话)是在数组类型派生的[和]中指定的那些。“

关于偏好一种形式而非另一种形式的原因,这取决于人们。这里是H &小号说的话(从T arr[]切换到T *array):

(H & S,5.4.3数组界限)“这将更加准确地反映了执行,但是不太清楚地表明意图”

+0

谁是H&S? Google对这样一个简短的查询并不是很有帮助。 – orlp 2012-04-20 14:24:53

+0

Harbison&Steele http://careferencemanual.com – ouah 2012-04-20 14:25:46

+0

[Harbison&Steele](http://careferencemanual.com/)。 – 2012-04-20 14:26:25

1

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

2

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

0

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