簡體   English   中英

使用指針或不使用指針將結構傳遞給函數

[英]Passing a struct to a function, using pointers or not

我試圖在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。 我一直試圖在結果之前改變它,添加&刪除*它看起來合理,但到目前為止,我沒有工作的東西。 任何人都可以指出它有什么問題嗎? 據我所知,我傳遞了一個指向函數setPartTo()的指針,但也許我不這樣做。 我還認為不將指向結構BigNumber的指針傳遞給函數getPart是有意義的,因為它不會改變對象,但也許這也是錯誤的?

這個:

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 &result的地址傳遞給setPartTo()

你的代碼:

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

這需要一個指向BigNumber的指針,因為您傾向於使用pass by值,這可能會使其難以使用。 您可以編寫此類版本,而不是:

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

您可能會發現性能方面,最好避免按值傳遞大結構。 另一方面,您的編譯器也可能會發現它並為您優化它。 如果你擔心這方面的問題,你應該閱讀生成的代碼,然后分析/測量性能。

問題出在這里:

BigNumber *result = &newBigNumber();

newBigNumber()按值生成struct,你不能像這樣獲取它的地址。 您需要將結構分配給變量,然后在需要時稍后獲取其地址。

BigNumber result = newBigNumber();

然后在調用setPartTo()時傳遞&result而不是result

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM