C &引用;“复合文字”;作为论据

C &引用;“复合文字”;作为论据,c,function-parameter,compound-literals,C,Function Parameter,Compound Literals,在语句中调用函数sum(int[],arr\u size) total = sum((int []){1,2,3,4,5}, 5); 复合文字(int[]){1,2,3,4,5}作为参数传递。很明显,数组的长度是由literal中的元素数决定的(这里当然是5)。那么将5作为另一个参数传递有什么必要呢 我们不能将上述函数定义为 sum(int []) {....} 然后称之为 total = sum((int []){1,2,3,4,5}) ?您的函数sum与sum(int*,size\u

在语句中调用函数
sum(int[],arr\u size)

total = sum((int []){1,2,3,4,5}, 5);
复合文字
(int[]){1,2,3,4,5}
作为参数传递。很明显,数组的长度是由literal中的元素数决定的(这里当然是
5
)。那么将
5
作为另一个参数传递有什么必要呢

我们不能将上述函数定义为

sum(int []) {....}
然后称之为

total = sum((int []){1,2,3,4,5})

您的函数
sum
sum(int*,size\u t)
相同;方括号只是语法上的糖。在任何一点上都不会传递数组,实际上,在C中不能将数组作为函数参数传递。因此,函数参数的“数组”部分中没有大小信息,必须单独传递大小。

您可以用这种方式定义
sum
,并调用它,如示例所示,但在这种情况下,您将无法确定函数中数组的大小

您可以做的是将
sum
声明为

int sum(int (*a)[5]) 
{
  ...
}
然后称之为

total = sum(&(int []){1,2,3,4,5});

但在这种情况下,您将仅限于大小为
5
的数组。如果您想让一个函数可以处理任何大小的数组,您必须从外部传递大小,或者在数组中保留某种类型的“终止符”元素。

这里
复合文字
用作参数。@haccks:但仍然没有数组函数参数。复合文字衰减为指向第一个元素的指针。@qwwqwq:这是不正确的。
(int[])
不是强制转换,而是复合文字语法的一部分。强制转换的操作数是表达式或括号中的类型名<代码>{1,2,3,4,5}两者都不是。表达式
(int[]){1,2,3,4,5}
是数组类型,具体地说是
int[5]
。它隐式地转换为
int*
,因为所有数组类型的表达式都转换为指针,只有三个例外在这里不适用。明白了,伙计!你在函数定义中固定了数组的大小,这就是为什么你不传递这个大小,对吗?@haccks:是的。因此,您可以选择固定大小或单独传递大小。还要注意,在我的版本中,数组是通过“指向数组的指针”参数传递的。这就是为什么通话中有一个
&
。在函数内部,数组必须以
(*a)[i]
的形式访问,而不是以
a[i]
@haccks的形式访问:几乎每次处理数组时,都必须使用指针。建议阅读:基思·汤普森;谢谢你的链接,先生。实际上,这一章
Arrays
是在我读的那本书
指针之前给出的,我是在
Arrays
上的,这就是我害怕指针的原因。@haccks:你可以在没有明确使用指针或不知道指针的情况下使用数组做很多事情。但是,正如您所看到的,使用数组表达式作为函数参数可能不应该是其中之一。