使用指针或不使用指针将结构传递给函数

时间:2012-09-20 10:09:17

标签: c pointers struct

我试图在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;
}

我在add函数的setPartTo行遇到错误。它说它期望一个结构BigNumber *但得到一个BigNumber。我一直试图在结果之前改变它,添加&amp;并删除*它看起来合理,但到目前为止,我没有工作的东西。任何人都可以指出它有什么问题吗?据我所知,我传递了一个指向函数setPartTo()的指针,但也许我不这样做。我也认为不将指向结构BigNumber的指针传递给函数getPart是有道理的,因为它不会改变对象,但也许这也是错误的?

3 个答案:

答案 0 :(得分:2)

此:

setPartTo(result, i, getPart(a, i)+getPart(b, i)+carrier);

是不正确的,因为只有两个参数传递给getPart(),它带有三个参数:

int getPart(BigNumber bigNumber, int i, int value)

除了问题中发布的错误之外,编译器还会发出其他错误。

此外,正如Graham Borland已经提到的那样,您需要存储newBigNumber()的返回值:

BigNumber result = newBigNumber();

然后将结果地址&result传递给setPartTo()

答案 1 :(得分:1)

您的代码:

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;
}

您可能会发现性能方面,最好避免按值传递大型结构。另一方面,您的编译器也可能会发现它并为您优化它。如果你担心这方面的问题,你应该阅读生成的代码,然后分析/测量性能。

答案 2 :(得分:1)

问题在于:

BigNumber *result = &newBigNumber();

newBigNumber()按值生成结构,你不能像这样获取它的地址。您需要将结构分配给变量,然后在需要时稍后获取其地址。

BigNumber result = newBigNumber();

当您致电&result时,请传递result而不是setPartTo()