如何获得修改任何参数的功能?

时间:2017-12-12 15:43:05

标签: c fractions function-call

我的目标:

我必须创建一个能够累加两个分数的函数。

我已经定义了一个名为struct的新fraction(typedef)。

该函数不能有返回类型fraction,它必须是void,因此它必须修改输入的参数之一,我该如何实现?指针可能吗?你会如何修改我的代码来实现它?

这是我的代码:

typedef struct{
    char sign;
    int num;
    int den;
} fraction;

void sum(fraction, fraction, fraction);

int main(void) {

    fraction op1, op2, solution;

    sum(op1, op2, solution);

    return 0;
}

void sum(fraction f1, fraction f2, fraction sol){

    if (f1.sign == '-') {
        f1.num = f1.num * -1;
    }

    if (f2.sign == '-') {
        f2.num = f2.num * -1;
    }

    sol.num = f1.num*f1.den + f2.num*f1.den;
    sol.den = f1.den * f2.den;
    sol.sign = '+';

    if (sol.num < 0) {
        sol.sign = '-';
        sol.num = sol.num * -1;
    }
}

1 个答案:

答案 0 :(得分:4)

这通常有点宽泛,但为了向您展示指针,让我补充一下,是的,您正确的路径。

  

指针可能?

是。详细说明为什么部分:

C使用pass-by-value进行函数参数传递,因此,您无法从被调用函数内部修改参数,并期望该值在调用者中保留/反映。但是,如果我们将指针作为参数传递,则指针本身不能如上所述从被调用函数中修改,但是对指向指针的内存位置所做的任何更改都将反映调用者(只要指针本身有效)。

现在,来到如何部分:

您需要传递第三个参数(或者,应该存储结果的任何一个)作为指向结构变量的指针。这样,对被调用函数内部地址所指向的内存位置的修改将反映在调用者中。

因此,您的函数签名将类似于

 void sum(fraction f1, fraction f2, fraction * sol)

,函数调用看起来像

 sum(op1, op2, &solution);

现在,在调用函数内访问sol,我留给你。