1

我目前正在使用教科书C: How to program 6/e学习 C 编程。

现在,在讨论数组的书中,它指出当将数组(不是字符数组,由于 '\0' 字符)传递给函数时,需要将数组中的元素数传递给功能也是如此

所以考虑到我的功能

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

int myfunct(int *myary, int numelements);

假设 ary 已经声明了 10 个元素,并且我们现在在 main 函数中。

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] );
    }
}

这段代码似乎可以在没有附加参数的情况下正确编译,但我不明白为什么书中会说我需要它们,许多网站也是如此。帮助!

4

3 回答 3

4

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

没有必要,即使您没有将数组大小作为参数传递给函数,您的代码也会编译。
但这样做是一个好习惯。

理由:

C 没有为您提供对数组进行边界检查的方法。您可以通过数组索引或指针算术访问超出数组的范围(在引擎盖下,两者都是相同的)并且编译器不需要警告您。但是你最终会得到一个Undefined Behavior
所以重要的是你只访问属于你的数组的内存。为了能够做到这一点,您需要跟踪数组的大小。这是用户的责任。

当您将数组作为参数传递时,它会衰减为指向数组第一个元素的指针。
所以sizeof(arg)在函数内部会给你指针的大小而不是数组。

除非您将它作为参数或通过其他一些簿记(如全局变量等)传递,否则您 无法知道函数内部数组的大小(空终止字符串例外,可以通过 获取谁的大小)。strlen

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

于 2013-01-12T06:24:00.730 回答
1

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

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

如果是这样,为什么?

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

于 2013-01-12T06:25:05.473 回答
0

更好的说法是函数需要知道要做什么。特别是,它需要知道在一个数组中使用多少个元素。

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

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

于 2013-01-12T10:49:23.943 回答