C函数参数中的数组语法与指针语法
我理解数组如何衰减到指针。 我明白,对于编译器,这个:
void foo(int *arg1);
是100%相当于:
void foo(int arg1[]);
一种风格应该优先于另一种吗? 我希望保持一致,但我很难为两种决定辩护。
虽然int main(int argc, char *argv[])
和int main(int argc, char **argv)
是相同的,但前者似乎更常见(如果我错了,请纠正我)。
我建议不要使用函数参数的[]
语法。
支持使用[]
的一个论点是,它以自我记录的方式暗示指针应指向多个事物。 例如:
void swap(int *x, int *y) double average(int vals[], int n)
但是为什么char *
总是用于字符串而不是char []
? 我宁愿保持一致,也总是使用*
。
有些人喜欢const
他们可能做的一切,包括传值参数。 使用[]
时的语法(仅在C99中可用)不太直观,可能不太为人所知:
const char *const *const words
vs. const char *const words[const]
虽然我确实认为最终的const
是过度的,无论如何。
此外,arrays衰减的方式并不完全直观。 特别是,它不是递归应用的 ( char words[][]
不起作用)。 特别是当你开始抛出更多的间接时, []
语法只会引起混淆。 IMO最好总是使用指针语法,而不是假装数组作为参数传递。
更多信息: http : //c-faq.com/~scs/cgi-bin/faqcat.cgi?sec = aaryptr #aryptrparam 。
除了char*
,我使用Type array[N]
,其中N是某个数字或定义的常量,当传递的项目在概念上是一个数组时(即,它包含N> 1个元素),当传递的项目Type * pointer
, Type * pointer
指向一个对象的指针。
如果数组的大小可变,我倾向于使用std::vector
。 C99的可变大小数组的概念在C ++中不可用。