【问题标题】:Understanding Function prototypes了解函数原型
【发布时间】:2013-06-27 19:50:54
【问题描述】:

是函数原型吗

int sum_array(int array[], int arr_length);  

int sum_array(int [], int arr_length);  

类似的?
如果是,那么int [] 是什么意思?
我可以通过交换位置来定义上述原型吗,即

 int sum_array( int arr_length, int array[]); 

?
注意:我对指针一无所知(抱歉)。

【问题讨论】:

  • 在原型中,int a_very_long_name[]int a_long_name[]int a_name[]int a[]int [] 都是同一个意思。
  • @JimBalter;但我认为在最后一个,即int [],没有变量名。
  • 是的......你的意思是什么?变量名称不在原型中使用(在大多数情况下,例如这个;也有例外),它只是为了清晰/文档。你已经阅读了答案并接受了一个,所以你现在应该知道了。
  • 我的意思很清楚......我和int [] 混淆了。我认为它是如何表示没有变量名的数组的。
  • 你写的东西不是很清楚......最后一句话肯定不是。

标签: c arrays argument-passing function-parameter


【解决方案1】:

两个原型都是一样的。第一个只是给第一个参数命名:

int sum_array(int array[], int arr_length);

int sum_array(int [], int arr_length); 

都是一样的。命名原型中的参数仅供参考。

同样的,你可以这样做:

int sum_array(int [], int);

之后的实现将如下所示:

int sum_array(int array[], int arr_length)
{ ... }

但是你不能交换参数,那不是一回事。 如果交换参数,则该函数的实现和调用也必须交换参数。

【讨论】:

  • int []是什么意思??
  • 它只是告诉编译器该参数将是一个int 的数组。它与int array[] 相同,但在这里您为参数命名以进行描述。我更喜欢在我的原型中命名参数,它使我更容易阅读头文件。
  • 感谢您的回答。(+1)。
【解决方案2】:

C 标准规定您可以为函数原型中的参数声明标识符,但您不必这样做。

标识符 ... 仅出于描述目的而声明,并在声明末尾超出范围

所以回答你的第一个问题,前两个原型之间基本上没有区别。 int [] 表示“一个整数数组”,类似于int array[] 表示“一个被标识为array 的整数数组”。

第三个原型也可以,但是变量会以相反的顺序被压入堆栈。只要原型和定义使用相同的顺序,您就可以这样做。

【讨论】:

  • 这意味着如果函数调用传递的参数被交换到,交换将起作用?
  • 完全正确;否则你应该得到一个编译器错误,因为在编译器看来你试图使用int 代替int[],反之亦然。
  • 知道了!第三段+1。
  • 参数不一定被压入堆栈。相关的是所有原型和调用必须一致。
猜你喜欢
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 2019-10-16
  • 2015-10-24
  • 2018-09-07
相关资源
最近更新 更多