我的目标:
我必须创建一个能够累加两个分数的函数。
我已经定义了一个名为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;
}
}
答案 0 :(得分:4)
这通常有点宽泛,但为了向您展示指针,让我补充一下,是的,您正确的路径。
指针可能?
是。详细说明为什么部分:
C使用pass-by-value进行函数参数传递,因此,您无法从被调用函数内部修改参数,并期望该值在调用者中保留/反映。但是,如果我们将指针作为参数传递,则指针本身不能如上所述从被调用函数中修改,但是对指向指针的内存位置所做的任何更改都将反映调用者(只要指针本身有效)。
现在,来到如何部分:
您需要传递第三个参数(或者,应该存储结果的任何一个)作为指向结构变量的指针。这样,对被调用函数内部地址所指向的内存位置的修改将反映在调用者中。
因此,您的函数签名将类似于
void sum(fraction f1, fraction f2, fraction * sol)
,函数调用看起来像
sum(op1, op2, &solution);
现在,在调用函数内访问sol
,我留给你。