C函数参数中的数组语法与指针语法

时间:2012-08-26 04:31:54

标签: c++ c arrays pointers parameters

我理解数组如何衰减到指针。我理解,对于编译器,这个:

void foo(int *arg1);

100%相当于:

void foo(int arg1[]);

一种风格应该优先于另一种吗?我希望保持一致,但我很难为两种决定辩护。

虽然int main(int argc, char *argv[])int main(int argc, char **argv)是相同的,但前者似乎更常见(如果我错了,请纠正我)。

2 个答案:

答案 0 :(得分:7)

对于函数参数,我建议使用[]语法反对

支持使用[]的一个论点是,它以自我记录的方式暗示指针应指向多个事物。例如:

void swap(int *x, int *y)
double average(int vals[], int n)

但是为什么char *总是用于字符串而不是char []?我宁愿保持一致,也总是使用*

有些人喜欢const他们可能做的一切,包括传值参数。使用[]时的语法(仅在C99中可用)不太直观,可能不太为人所知:

const char *const *const wordsconst char *const words[const]

虽然我确实认为最终的const有点矫枉过正,无论如何。

此外,数组衰减的方式并不完全直观。特别是not applied recursivelychar words[][]不起作用)。特别是当您开始抛出更多间接时,[]语法只会引起混淆。 IMO最好始终使用指针语法,而不是假装数组作为参数传递。

更多信息:http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr#aryptrparam

答案 1 :(得分:3)

除了char*之外,我使用Type array[N],其中N是某个数字或定义的常量,当传递的项目在概念上是一个数组时(即,它包含N> 1个元素),{{ 1}}当传递的项是指向一个对象的指针时。

如果数组的大小可变,我倾向于使用Type * pointer。 C99的可变大小数组的概念在C ++中不可用。