2011-07-28 64 views
6

假设我有以下c功能:C - 数组中的元素数量?

int MyFunction(const float arr[]) 
{ 
    // define a variable to hold the number of items in 'arr' 
    int numItems = ...; 

    // do something here, then return... 

    return 1 

} 

我怎样才能进入numItems在阵列arr中的项目数量?

+1

我记得我用来做大小另有说法为这样那样的功能.. [静态数组元素的数量的 – mihsathe

+3

可能重复和动态数组](http://stackoverflow.com/questions/2577711/number-of-elements-in-static-array-and-dynamic-array) – sth

回答

11

不幸的是,你无法得到它。在C中,以下2个是等价的声明。

int MyFunction(const float arr[]); 
int MyFunction(const float* arr); 

您必须自己传递尺寸。

int MyFunction(const float* arr, int nSize); 

char指针指定字符串的字符数组的长度的情况下,通过分隔符'\0'确定。

+1

很好的答案。哪个函数定义是首选的:第一个('使用arr []')或第二个('使用* arr []')? – user3262424

+0

@ user3262424:您在评论中输入错误 - 小心! :)我认为'浮动arr []'和'浮动*'之间选择传递数组是一个品味问题 –

+0

谢谢阿门。对不起,错字。 – user3262424

1

这是不可能的,除非你有一些预定义的数组格式。因为潜在的你可以有任何数量的浮动。并且const float arr[]只能将阵列的基地址传递给类型为float []的功能,该功能无法修改。所以你可以为narr[n]

5

要么在另一个参数中传递元素的数量,要么在数组中的分隔元素上有一些约定。

5

我最初建议这样的:

int numItems = sizeof(arr)/sizeof(float); 

But it will not work因为arr未在当前上下文中定义并且它被解释为一个简单的指针。 所以在这种情况下,你将不得不提供元素的数量作为参数。建议的声明否则将在以下情况下工作:

int MyFunction() 
{ 
    float arr[10]; 
    int numItems = sizeof(arr)/sizeof(float); 
    return numItems;// returns 10 
} 
+2

arr是一个函数参数。它只是一个指针,而不是数组 - 不起作用。 http://ideone.com/sQqWP – sidyll

+2

这是不正确的。当它是一个函数参数时,'arr'不是'float []'类型。相反,它是'float *'。 –

+0

@Susam:可能这就是我说的吗? – sidyll

2

您不能。该号码必须分别传送至MyFunction。所以向MyFunction添加第二个参数,它应该包含大小。

2

正如我在评论中所说的,将它作为另一个论点传递似乎是唯一的解决方案。否则,你可以有一个全局定义的约定。

1

int numItems = sizeof(arr)/sizeof(float); 

更好的是

int numItems = sizeof(arr)/sizeof(*arr);