将数组传递给函数时,是否需要提供元素数作为参数?

时间:2013-01-12 06:21:07

标签: c arrays

我目前正在使用教科书 C:如何编程6 / e 来学习C编程。

现在,在讨论数组的书中,它指出当一个数组(除了字符数组,由于'\ 0'字符)传递给一个函数时,它是必要的将数组中的元素数量传递给函数

所以给我的功能

int myfunct(int myary[], int numelements);

int myfunct(int *myary, int numelements);

假设已使用10个元素声明ary,并且我们现在处于主函数中。

myfunct(ary, 10); 

int numelements是否必要[在任何一种情况下],如果是,为什么)。这本书指出编译器要知道要处理的元素的正确数量,然而这本书接着在几乎所有的例子中都没有这样做,并且非常非常不一致。

此外,

int myfunct(int myary[][10], int numrows, int numcolumns);

关于numrows和numcolumns的相同问题。

进一步说明:

#include <stdio.h>
void test(const int ary[]);

int main(void){

    int myary[10] = {1,2,3,4,5,6,7,8,9,10};
    test(myary);

    return 0;
}

void test (const int ary[]){
    int i;

    for(i = 0; i<10; i++){
        printf("The number in array element %d is:    %d\n", i, ary[i] );
    }
}

这段代码似乎没有附加参数就可以正确编译,但是我不明白为什么这本书会说我需要它们,所以很多站点也是如此。帮助!

3 个答案:

答案 0 :(得分:4)

  

有必要吗?如果我不将数组大小作为参数传递,我的代码是否会编译?

没有必要&amp;即使您没有将数组大小作为参数传递给函数,您的代码也会编译 但这样做是一种很好的做法。

  

<强>理由:

C不提供检查数组的边界方法。您可以通过数组索引或指针算法(引擎盖下,两者都是相同的)访问超出数组范围的内容,编译器无需向您发出警告。但是你最终会得到未定义的行为 因此,只访问属于您的阵列的内存非常重要。为此,您需要跟踪数组的大小。用户有责任这样做。

当您将数组作为参数传递时,它会衰减为指向数组第一个元素的指针 因此,函数内的sizeof(arg)将为您提供指针的大小而不是数组。

你无法知道函数内部数组的大小(空终止字符串的异常,其大小可以通过strlen 获得),除非你将它作为一个传递参数或通过其他一些bookeeping(如全局变量等)。

将大小作为参数传递是最明显的方法。

答案 1 :(得分:1)

  

是否有必要提供元素数作为参数?

大多数时候,是的。正如您已经指出的那样,在传递以null结尾的C字符串时没有必要。

  

如果是这样,为什么?

因为您的函数没有其他方法可以知道数组中有多少元素。因此,如果您的功能需要知道,您需要提供该信息。

答案 2 :(得分:0)

更好的说法是该功能需要知道该怎么做。特别是,它需要知道在数组中使用多少元素。

您可以通过在参数中传递数字,通过将其构建到具有常量的函数中,或通过以某种方式在数组中标记最终元素(例如,字符串中的'\ o'字符)来告诉它,或通过其他方式(例如,可以计算数字的参数,或全局变量[通常是一个糟糕的设计选择])。

简而言之,这仅仅是必要性:代码必须具备完成工作所需的信息。它与C无关。