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

Array syntax vs. pointer syntax in C function parameters

本文关键字:语法 指针 数组 函数 参数      更新时间:2023-10-16

我了解数组如何衰减为指针。我知道,对于编译器来说,这是:

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 wordsconst char *const words[const]

尽管我确实认为最后的const在任何情况下都是过头了。

此外,数组衰减的方式并不完全直观。特别是,它是而不是递归应用的(char words[][]不起作用)。尤其是当您开始引入更多的间接性时,[]语法只会引起混乱。IMO最好始终使用指针语法,而不是假装将数组作为参数传递。

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

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

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