我了解数组如何衰减为指针。我知道,对于编译器,这是:
void foo(int *arg1);
100% 相当于:
void foo(int arg1[]);
一种风格应该优于另一种风格吗?我想保持一致,但我很难证明任何一个决定都是合理的。
虽然int main(int argc, char *argv[])
和int main(int argc, char **argv)
相同,但前者似乎更常见(如果我错了,请纠正我)。
我了解数组如何衰减为指针。我知道,对于编译器,这是:
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
对比const char *const words[const]
虽然我确实认为决赛const
是矫枉过正,无论如何。
此外,数组衰减的方式并不完全直观。特别是,它不是递归应用的(char words[][]
不起作用)。尤其是当您开始使用更多的间接性时,[]
语法只会引起混乱。IMO 最好始终使用指针语法,而不是假装将数组作为参数传递。
更多信息:http ://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr#aryptrparam 。
除了char*
,我使用Type array[N]
,其中 N 是某个数字或定义的常量,当传递的项目在概念上是一个数组(即,它包含 N>1 个元素),Type * pointer
当传递的项目是指向一个对象的指针时。
std::vector
如果数组的大小可变,我倾向于使用。C99 的可变大小数组概念在 C++ 中不可用。