C编码:用于循环/通过引用混淆调用

时间:2016-11-30 07:23:22

标签: c

在这个程序中,我不太明白注释下面发生了什么:/ *传递数组* /。该程序的输出应为输入温度#0,#1,#2 .....#30的31次迭代,然后将这些用户输入的值转换为摄氏度。我的困惑在于函数调用转换(temps)的目的或方式以及下面的所有内容如何起作用。

有关代码“如何工作”以实现所述输出的任何说明都会很棒。另外是通过参考转换函数发生的调用,如果是这样,有人可以解释其中的动态。

谢谢。

#define COUNT 31
void convert (float heat[]);
void main()
{
    float temps[COUNT];
    int index;
    /*load the array with values*/
    for (index = 0; index < COUNT ; index++)
    {
        printf("Enter temperature #%d: ", index);
        scanf("%f", &temps[index]);
    }
    /*pass the array */
    convert(temps);
    for (index = 0; index < COUNT ; index++)
        printf("%6.2f\n", temps[index]);
}

/*******************convert function ************************/
void convert (float heat[])
{
    int index;
    for (index = 0; index < COUNT; index++)
    {
        heat[index] = (5.0/9.0)*(heat[index]-32);
    }
}

2 个答案:

答案 0 :(得分:0)

函数 convert 接收指向 temps 数组的第一个元素的指针,然后修改其元素。换句话说,永远不会复制数组。由于只传递了一个指针,因此无法确定形式参数 heat convert 中的时长。因此,传递数组的长度也是一个好主意。我将如何做到这一点:

#include <stdio.h>
#include <stdlib.h>

#define LEN(arr) ((int) (sizeof (arr) / sizeof (arr)[0]))

void convert(float heat[], int heatLen)
{
    int i;

    for (i = 0; i < heatLen; i++) {
        heat[i] = (5.0 / 9.0) * (heat[i] - 32);
    }
}


int main(void)
{
    float temps[31];
    int i, nRead;

    for (i = 0; i < LEN(temps) ; i++) {
        printf("Enter temperature #%d: ", i);
        nRead = scanf("%f", &temps[i]);
        if (nRead != 1) {
            fprintf(stderr, "Invalid input\n");
            exit(EXIT_FAILURE);
        }
    }

    convert(temps, LEN(temps));

    for (i = 0; i < LEN(temps) ; i++) {
        printf("%6.2f\n", temps[i]);
    }

    return 0;
}

答案 1 :(得分:0)

C中没有call by reference这样的内容。 语言支持按值调用。

电话

convert(temps);

传递。由于temps是一个数组,它确实通过了address of the first element in the array。对于函数,它看起来像pointer to float - 我们说当用作函数参数时,数组会衰减为指针。

convert函数内,您可以使用传递的地址值(也就是使用指针)更改数组中元素的值。这可以通过简单的索引来完成,比如

temps[i] = .....;

*(temps + i) = ....;