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

mk1*_*k12 5 c c++ arrays parameters pointers

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

void foo(int *arg1);
Run Code Online (Sandbox Code Playgroud)

是100%相当于:

void foo(int arg1[]);
Run Code Online (Sandbox Code Playgroud)

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

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

mk1*_*k12 7

我建议不要使用[]函数参数的语法.

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

void swap(int *x, int *y)
double average(int vals[], int n)
Run Code Online (Sandbox Code Playgroud)

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

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

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

虽然我确实认为最终const是过度杀戮,无论如何.

此外,阵列衰减的方式并不完全直观.特别是,它不是递归应用的(char words[][]不起作用).特别是当你开始抛出更多的间接时,[]语法只会引起混淆.IMO最好总是使用指针语法而不是假装数组作为参数传递.

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