C函数参数中的数组语法与指针语法
Array syntax vs. pointer syntax in C function parameters
我了解数组如何衰减为指针。我知道,对于编译器来说,这是:
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*
,当传递的项在概念上是一个数组(即它包含N>1个元素)时,我使用Type array[N]
,其中N是某个数字或定义的常数,当传递项是指向一个对象的指针时,使用Type * pointer
。
如果数组大小可变,我倾向于使用std::vector
。C99的可变大小数组概念在C++中不可用。
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- QMetaObject invokeMethod的基于函数指针的语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 使用基类指针调用基类的值构造函数的语法是什么?
- C++语法差异:二维和一维数组(指针算术)
- C++中未命名函数指针的语法
- c++ 获取非语法使用"&"创建指针
- C++语法中的函数指针
- 存储函数指针的正确语法
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 非标准语法,使用 & 创建指向成员的指针
- 将引用绑定到指针的语法是什么?(各种)
- 如何使用二维语法访问指针
- 带有自定义类的共享指针语法背后的任何原因,如下所示
- 非标准语法使用 '&' 创建指向成员 C++ 的指针
- 如何在不更改现有函数语法的情况下将普通指针替换为共享指针
- C++指向函数声明语法的指针
- 难以理解指针语法C++
- 数组的语法指针C++