C 是否使用指针将结构传递给函数

C 是否使用指针将结构传递给函数,c,pointers,struct,C,Pointers,Struct,我正在尝试用c实现一个简单的BigNumber包,它可以执行算术运算。然而,我被卡住了。我是c语言的新手,所以我不确定我是否正确使用了指针和引用 以下是我目前的代码: #define MAXPARTS 60 struct BigNumber { int parts[MAXPARTS]; }; typedef struct BigNumber BigNumber; BigNumber newBigNumber() { BigNumber bi; int i;

我正在尝试用c实现一个简单的BigNumber包,它可以执行算术运算。然而,我被卡住了。我是c语言的新手,所以我不确定我是否正确使用了指针和引用

以下是我目前的代码:

#define MAXPARTS 60

struct BigNumber
{
    int parts[MAXPARTS];
};

typedef struct BigNumber BigNumber;

BigNumber newBigNumber()
{
    BigNumber bi;
    int i;
    for(i = 0; i < MAXPARTS; i++)
    {
        bi.parts[i] = 0;
    }
    return bi;
}

void setPartTo(BigNumber *bigNumber, int i, int value)
{
    (*bigNumber).parts[i] = value;
}

int getPart(BigNumber bigNumber, int i, int value)
{
    return bigNumber.parts[i];
}

BigNumber add(BigNumber a, BigNumber b)
{
    int carrier = 0;
    BigNumber *result = &newBigNumber();
    int i;
    for(i = 0; i < MAXPARTS; i++)
    {
        setPartTo(result, i, getPart(a, i)+getPart(b, i)+carrier);
    }
    return result;
}
#定义MAXPARTS 60
结构大数
{
整数部分[最大部分];
};
typedef结构BigNumber BigNumber;
BigNumber newSignNumber()
{
大数bi;
int i;
对于(i=0;i
我在add函数的setPartTo行中得到一个错误。它说它需要一个结构BigNumber*但得到了一个BigNumber。我一直试图在结果之前改变这个东西,在看起来合理的地方添加和删除,但到目前为止,我还没有让这个东西起作用。有人能指出它有什么问题吗?就我所见,我传递了一个指向函数setPartTo()的指针,但也许我没有。我还认为,不将指向struct BigNumber的指针传递给函数getPart是有意义的,因为它不会更改对象,但这也可能是错误的?

您的代码:

void setPartTo(BigNumber *bigNumber, int i, int value)
{
   (*bigNumber).parts[i] = value;
}
这需要一个指向
BigNumber
的指针,因为您倾向于使用pass-by-value,因此可能很难使用该指针。你可以写一个这样的版本:

BigNumber setPartTo(BigNumber bigNumber, int i, int value)
{
  bigNumber.parts[i] = value;
  return bigNumber;
}
您可能会发现,在性能方面,最好避免按值传递大型结构。另一方面,编译器可能也会发现这一点,并为您进行优化。如果您对这方面有任何担心,那么您应该阅读生成的代码,并分析/衡量性能。

您的代码:

void setPartTo(BigNumber *bigNumber, int i, int value)
{
   (*bigNumber).parts[i] = value;
}
这需要一个指向
BigNumber
的指针,因为您倾向于使用pass-by-value,因此可能很难使用该指针。你可以写一个这样的版本:

BigNumber setPartTo(BigNumber bigNumber, int i, int value)
{
  bigNumber.parts[i] = value;
  return bigNumber;
}
您可能会发现,在性能方面,最好避免按值传递大型结构。另一方面,编译器可能也会发现这一点,并为您进行优化。如果您担心这方面的问题,那么您应该阅读生成的代码,并分析/衡量性能。

问题在于:

BigNumber *result = &newBigNumber();
newBigNumber()
按值生成结构,不能这样获取其地址。您需要将结构分配给变量,然后在需要时获取其地址

BigNumber result = newBigNumber();
然后在调用
setPartTo()

时传递
&result
而不是
result

BigNumber *result = &newBigNumber();
newBigNumber()
按值生成结构,不能这样获取其地址。您需要将结构分配给变量,然后在需要时获取其地址

BigNumber result = newBigNumber();
然后在调用
setPartTo()

时传递
&result
而不是
result
,如下所示:

setPartTo(result, i, getPart(a, i)+getPart(b, i)+carrier);
不正确,因为只有两个参数被传递到
getPart()
,其中包含三个参数:

int getPart(BigNumber bigNumber, int i, int value)
除了问题中发布的错误外,编译器还将发出其他错误

此外,正如前面提到的,您需要存储
newBigNumber()
的返回值:

然后将结果的地址
&result
传递到
setPartTo()
中,如下所示:

setPartTo(result, i, getPart(a, i)+getPart(b, i)+carrier);
不正确,因为只有两个参数被传递到
getPart()
,其中包含三个参数:

int getPart(BigNumber bigNumber, int i, int value)
除了问题中发布的错误外,编译器还将发出其他错误

此外,正如前面提到的,您需要存储
newBigNumber()
的返回值:


然后将result的地址
&result
传递到
setPartTo()

我现在看到,add函数在数学上也不正确,但我宁愿先修复另一个错误。另外,newBigNumber()返回的本地结构在使用它时超出了范围。您应该为一个BigNumber指定malloc()并返回一个指向它的指针
typedef结构BigNumber\u s BigNumber。在此之后调整此结构的定义名称。@deStrangis:这不正确。堆栈分配的数据将被复制到调用
newBigNumber()
中提供的左值。除了所有其他混乱之外,我真想知道为什么编译器似乎拒绝传入
BigNumber*
,其中一个
BigNumber*
,即作为
setPartTo()
的第一个参数,如操作所述。我现在明白了,另外,add函数在数学上也不正确,但我宁愿先修复另一个错误。另外,newBigNumber()返回的本地结构在您使用它时超出了范围。您应该为一个BigNumber指定malloc()并返回一个指向它的指针
typedef结构BigNumber\u s BigNumber。在此之后调整此结构的定义名称。@deStrangis:这不正确。堆栈分配的数据将被复制到调用
newBigNumber()
中提供的左值。除了所有其他混乱之外,我真的想知道为什么编译器似乎拒绝传入
BigNumber*
,其中需要一个
BigNumber*
,即作为
setPartTo()
的第一个参数,如OP所述。