Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数组传递给函数!混乱!在C语言编程中_C_Arrays_Function - Fatal编程技术网

将数组传递给函数!混乱!在C语言编程中

将数组传递给函数!混乱!在C语言编程中,c,arrays,function,C,Arrays,Function,示例阵列: int hourlyTemperatures[ 24 ]; 因此,在函数调用中,我们写入数组名称及其大小 modifyArray( hourlyTemperatures, 24 ) 我们知道上面提到的是将数组传递到函数的正确方法 但在下面的代码中,我看到我们调用了mean函数并传递数组,但没有给出它的元素大小,比如mean响应 所以我的问题是哪一个是正确的?用元素大小传递数组,还是用名称传递数组?为什么使用这两种方法 #include<stdio.h> #define

示例阵列:

int hourlyTemperatures[ 24 ];
因此,在函数调用中,我们写入数组名称及其大小

modifyArray( hourlyTemperatures, 24 )
我们知道上面提到的是将数组传递到函数的正确方法

但在下面的代码中,我看到我们调用了mean函数并传递数组,但没有给出它的元素大小,比如mean响应

所以我的问题是哪一个是正确的?用元素大小传递数组,还是用名称传递数组?为什么使用这两种方法

#include<stdio.h>
#define SIZE 99

void mean(const unsigned int answer[]);

int main(void)
{
    unsigned int response [SIZE] =
    {6,7,8,9,8,7,8,9,8,9,7,8,9,5,9,8,7,8,7,8,6,7,8,9,3,9,
     8,7,8,7,7,8,9,8,9,8,9,7,8,9,6,7,8,7,8,7,9,8,9,2,7,8,
     9,8,9,8,9,7,5,3,5,6,7,2,5,3,9,4,6,4,7,8,9,6,8,7,8,9,
     7,8,7,4,4,2,5,3,8,7,5,6,4,5,6,1,6,5,7,8,7
    };

    mean (response);
}

void mean (const unsigned int answer[])
{
    size_t j;
    unsigned int total = 0;

    printf("%s\n%s\n%s\n", "********", "Mean", "********");

    // total response values
    for(j=0; j<SIZE; ++j){
        total += answer[j];
    }

    printf ("The mean is the average value of the data items!\n"
           "The mean is the equal to the total of all data items\n"
           "divided by the number of data items (%u)\n\n", SIZE);

    printf("The mean value for this run is: %u / %u = %.4f\n\n", total, SIZE, (double)total/SIZE );

}
函数调用modifyArrayhourlyTemperatures,24传递一个指针,指向存储在数组hourlyTemperatures[]中的第一个int,这样函数知道在哪里找到第一个值,而int 24则知道数组有多大,以避免离开数组的末端

函数调用meansresponse传递指向数组响应[]中存储的第一个无符号int的指针,但函数需要另一种方法来知道数组的大小,因为调用方不会传递更多信息

编译程序时使用预处理器指令define SIZE 99,在实际编译之前,源代码中出现的任何字符“SIZE”都将替换为字符“99”,因此函数将用以下行解释:

for (j = 0; j < 99; ++j) {...
int size = 99;
在函数定义之前。这将使size成为一个全局变量,在它下面的任何函数中都可见,因此您可以编写:

for (j = 0; j < size; ++j) {...
但是,由于全局变量通常是一件坏事,您通常应该选择第一个方法,将数组的大小显式传递给处理数组的函数

因此,总结一下:

1通常最好将数组的大小显式传递给处理函数:ModifyArrayHourlyTemperations,24。这样,您就可以始终知道阵列的大小,并且可以使用不同大小的阵列:ModifyArrayHourlyTemperations,25,例如,如果您添加了温度测量值

2您可以定义一个常数来存储数组的大小,然后在数组处理函数中使用:define size 99。这样做的一个缺点是,如果要使用包含100个元素的数组,必须更改源代码,以便定义大小100,然后重新编译

3您可以声明一个全局变量来存储数组的大小,并在数组处理函数中使用该全局变量。源文件中声明下面的任何函数都可以访问全局变量。这种方法很容易出错:另一个函数可能会无意中更改size的值,当您调用mean时,会给您一个严重的惊喜


最后一件事-字符串是一个字符数组,但不仅仅是任何旧的字符数组:它必须以null结尾。这意味着字符串的最后一个字符必须是“\0”。即使字符串是数组,处理字符串的函数也不需要知道字符串的大小,因为该信息隐含在字符串中。您可以计算“\0”之前的字符数,也可以只使用strlen,或者只按顺序处理字符,直到结束。

它的编写方式,意味着它只起作用,因为大小定义为宏,它也将起全局作用。如果你只想让一个函数只接受一个大小的输入,在编译时定义,这在技术上是可行的,但是…我是个编程新手!你能详细清楚地告诉我吗?我不知道什么是宏!您可以搜索google或stackoverflow以了解C中的宏是什么。您不能在C中向函数传递数组。您只能向函数传递指针,这些指针可以指向数组的第一个元素。modifyArray hourlyTemperatures,24向函数传递两件事:1指向hourlyTemperatures的第一个元素的指针,2是数字24,如果我写int size=99;虽然我没有将数组大小传递给函数mean,但是为什么函数mean知道数组的大小?因为如果在定义任何函数之前声明int size,即在main和mean之前,变量大小可以在这些函数内部使用。它是全球性的。函数mean可以使用大小,就像它是通过函数调用传入的一样。但是,这通常是一个坏主意,因为对全局变量的任何更改都会影响使用它的所有函数。您应该仔细阅读可变范围、链接和存储持续时间,以便更好地理解这一点。