我目前正在使用教科书 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] );
}
}
这段代码似乎没有附加参数就可以正确编译,但是我不明白为什么这本书会说我需要它们,所以很多站点也是如此。帮助!
答案 0 :(得分:4)
有必要吗?如果我不将数组大小作为参数传递,我的代码是否会编译?
没有必要&amp;即使您没有将数组大小作为参数传递给函数,您的代码也会编译 但这样做是一种很好的做法。
<强>理由:强>
C不提供检查数组的边界方法。您可以通过数组索引或指针算法(引擎盖下,两者都是相同的)访问超出数组范围的内容,编译器无需向您发出警告。但是你最终会得到未定义的行为 因此,只访问属于您的阵列的内存非常重要。为此,您需要跟踪数组的大小。用户有责任这样做。
当您将数组作为参数传递时,它会衰减为指向数组第一个元素的指针
因此,函数内的sizeof(arg)
将为您提供指针的大小而不是数组。
你无法知道函数内部数组的大小(空终止字符串的异常,其大小可以通过strlen
获得),除非你将它作为一个传递参数或通过其他一些bookeeping(如全局变量等)。
将大小作为参数传递是最明显的方法。
答案 1 :(得分:1)
是否有必要提供元素数作为参数?
大多数时候,是的。正如您已经指出的那样,在传递以null结尾的C字符串时没有必要。
如果是这样,为什么?
因为您的函数没有其他方法可以知道数组中有多少元素。因此,如果您的功能需要知道,您需要提供该信息。
答案 2 :(得分:0)
更好的说法是该功能需要知道该怎么做。特别是,它需要知道在数组中使用多少元素。
您可以通过在参数中传递数字,通过将其构建到具有常量的函数中,或通过以某种方式在数组中标记最终元素(例如,字符串中的'\ o'字符)来告诉它,或通过其他方式(例如,可以计算数字的参数,或全局变量[通常是一个糟糕的设计选择])。
简而言之,这仅仅是必要性:代码必须具备完成工作所需的信息。它与C无关。