【问题标题】:Array syntax vs. pointer syntax in C function parametersC 函数参数中的数组语法与指针语法
【发布时间】:2012-08-26 04:31:54
【问题描述】:

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

void foo(int *arg1);

100% 相当于这个:

void foo(int arg1[]);

是否应该优先选择一种风格?我想保持一致,但我很难证明任何一个决定都是合理的。

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

【问题讨论】:

  • 如果您的目标是一致性,您应该使用星号,因为这与正常(非参数)声明一致。其他语法应该死,它只会引起混乱。

标签: c++ c arrays pointers parameters


【解决方案1】:

我建议反对对函数参数使用[] 语法。

支持使用[] 的一个论点是,它以一种自记录的方式暗示,指针应该指向不止一个事物。例如:

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 是矫枉过正,但无论如何。

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

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

【讨论】:

  • 使用 [] 这个语法比 * one 更安全吗?
  • 无论你使用数组还是指针作为函数参数,编译器绝对没有区别——它最终都会成为指针,因此会受到“指针风险”的影响。
【解决方案2】:

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

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

【讨论】:

  • 但是N 被默默地忽略了,我觉得这有误导性。
  • @KeithThompson:你是对的;编译器会忽略它。但是,您不仅仅是为编译器编写代码,您还在为代码的人类用户编写代码。从科学程序员的角度来看,数组衰减为指针是 C/C++ 中最大的缺陷之一。没有理由向那个巨大的漏洞磕头。
  • 如果你有一个指向字符串数组的指针(即字符串的 char 指针,单词的 char 指针,指向 char 指针的指针以允许函数写入)怎么办? char *(*words[])? IMO char ***words 看起来更好,更容易一目了然。不过,我想这种事情在 C(我主要感兴趣)中比 C++ 更常见。
  • @DavidHammen:是的,你是在为人类用户写作,这就是为什么我不想暗示 N 实际上意味着什么。
猜你喜欢
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多