我有一个问题。
我无法编译程序。 这是一个非常简单的程序,它为变量分配一个数组,并将其作为参数传递给函数。现在,在返回此数组时,它将返回该数组。
现在,我遇到了这样的语法错误:
p2.c:3:4:错误:预期标识符或'['令牌前的'(' int [] lifo(int [] arr)
对于以下程序,我无法解决该错误:
this.userStream$ = this.displayEvent$.pipe(
map(users => users
.filter((user: UserModel) => !this.closedUsers.has(user))
.slice(0, this.numberOfUsers))
// flatMap((users: UserModel[]) => from(users))
// // Don't include users we've previously closed.
// , filter((user: UserModel) => !this.closedUsers.has(user))
// , take(this.numberOfUsers)
// , toArray()
, tap(() => console.log('List updated!'))
// Unless we explicitly want to recalculate the list of users, re-use the current result.
, shareReplay(1));
答案 0 :(得分:3)
在C语言中,无法从函数返回数组,并且也无法将其传递给函数。但是,让我们从这里开始:您在这里对数组的声明是错误的:
int[] lifo(int[] arr)
在C语言中,数组声明中的括号放在声明器的之后。因此,要编写一个接受并返回数组的函数,“正确”语法应如下所示:
int lifo(int arr[])[]
如果您尝试这样做,那么好的编译器会给您这样的错误:
错误:“ lifo”声明为函数,返回数组
只是不允许返回数组。
尽管如此,编译器并没有抱怨参数int arr[]
:这是由于函数参数的特殊规则-如果它们具有数组类型,则会自动将它们调整为指针类型。因此,以下函数声明完全相同:
void lifo(int arr[]);
void lifo(int *arr);
您不能传递或返回数组。但是语法使函数看起来看起来像是一个数组-相反,它使用了指向该数组第一个元素的指针。
答案 1 :(得分:1)
lifo(int[] arr)
将其转换为:
lifo( int * arr )
或
lifo( int arr[] )
请注意,即使第二个变量也将传递 pointer (指针),而不是传递数组。 (对于一个,您将无法通过sizeof()
来确定元素的数量。)您仍然可以在arr
上使用索引访问,但是您可以在 any 上使用它。 em>指针。
对于返回值,请使用int *
。毕竟,这就是您要返回的内容–另一个指针,而不是数组。
(您的功能lifo
当然是非操作性的...我想这仅是出于示例的缘故。)
答案 2 :(得分:1)
在C语言中,您始终按其地址(例如其开头)传递数组。为此,您必须使用指针。这意味着您的函数定义无效。看起来应该像这样:
int* lifo(int* arr)
{
return arr;
}
但是此实现没有任何意义,因为输出指向与输入相同的位置。请参阅向您解释如何在C中处理数组的书。