2013-03-22 34 views
2

在我正在開發的初學者程序中,我必須使用3個函數來獲取兩個參數的總和和差值。在第三個函數中,我必須將結果存儲在兩個指針中。我的問題是,我還沒有能夠成功地將第三個功能集成到main中。關於將指針集成到程序中的建議

我的主要功能如下:

int main() 
{ 
    int num1, num2; 
    int sumResult, differenceResult; 

    printf("Please enter a number: "); 
    scanf("%d", &num1); 
    printf("Please enter another number: "); 
    scanf("%d", &num2); 

    sumResult = CalculateSum (num1, num2); 

    printf("the result of the sum is %d\n", sumResult); 

    differenceResult = CalculateDifference (num1, num2); 

    printf("the result of the difference is %d\n", differenceResult); 

    return 0; 
} 

我的函數的指針涉及:

void CalculateBoth(int num1, int num2, int*sumPtr, int *diffPtr) 
{ 
    *sumPtr = num1+num2; 

    *diffPtr= num1-num2; 

} 

有什麼建議?

+0

不知道你的意思是「整合......到主」如果你想_directly IN_主計算和/差,解決方案似乎是顯而易見的。如果你想打電話給你的函數,請告訴我們你認爲它應該如何工作,如果有必要,我們會盡力幫助你糾正錯誤。 – 2013-03-22 17:24:51

回答

0

這樣稱呼它 -

CalculateBoth(num1, num2, &sumResult, &differenceResult); 

不知道你是誤會這裏。例如 -

*sumPtr = num1+num2; 

由於sumPtr指向sumResult,結果實際上可以寫入。一旦函數返回,您可以在main中打印計算的值。

0

我不確定你的意思是整合。我認爲這是你正在尋找的:

CalculateBoth(num1, num2, &sumResult, &differenceResult) 
1

指針用於(通常)傳遞非參數值,但在參數值所在的內存中傳遞地址。這允許您修改參數值。

讓我們的功能,增加了2至說法和傳球導致通過結果變量爲例:

void WrongAdd2(int argument, int result) 
{ 
    result = argument + 2; 
} 

在這種情況下你傳遞結果價值,但在任何變化會是本地的。 指針不是告訴價值,而是告訴價值所在的地址。

void Add2(int argument, int *result) 
{ 
    *result = argument + 2; 
} 

這裏結果 '詮釋的地址',因此*導致是在內存中結果指出的地方。

要使用的函數指針,你應該有地方在內存中的結果:

int value = 10; 
int result = 0; 

WrongAdd2(value, result); /* result is still 0. */ 
Add2(value, &result);  /* result is updated and now it is 12. */ 

所以你需要調用CalculateBoth用相同的前2個論點,但結果將通過第三和第四個論據是指針傳遞到要放置輸出參數的位置(包含其地址)。

CalculateBoth(num1, num2, &sumResult, &differenceResult); 

你告訴:好,拿NUM1NUM2的價值觀和sumResultdifferenceResult作爲輸出參數傳遞地址。

1

要了解清楚閱讀回答線性

先了解你的函數聲明(閱讀評論):你的函數

void CalculateBoth(int num1, int num2,  int*sumPtr, int *diffPtr); 
//^
// return type   ^--------^     ^-----------^ 
//     first two are simple int last two are pointer to integers 

通知返回類型void意味着它不會返回(或說返回void)。

但你的函數CalculateBoth()好它同時計算總和差異。(兩點)

在C語言程序,我們不能從一個函數返回一個以上的說法。在這種情況下,指針非常有用。所以最後你的參數實際上是函數CalculateBoth()sun和difference的輸出參數。

像(再次閱讀評論):

void CalculateBoth(int num1, int num2,  int*sumPtr, int *diffPtr); 
//^
// return type   ^--------^     ^-----------^ 
//     two input arguments  Output sum and difference 

因爲傳值沒有反映在呼籲我們做的地址變量使用pass語句變化。

指針是可變的,可以保存其他變量的地址。

因爲在main()函數中,您需要兩個變量num1num2的總和和差值。當我們從main()調用函數CalculateBoth()時,我們傳遞了兩個結果變量的地址。

所以你導致主要變量()是:

int sumResult, differenceResult; 

你從主,如:

CalculateBoth(num1, num2, &sumResult, &differenceResult); 

注意:符號運營商&變量sumResult面前,differenceResult是該address-of operator給出了其操作數的地址。通過簡單的寫變量名就可以傳遞值,但是如果使用&運算符,則會傳遞變量的地址。

功能CalculateBoth()具有其變量的本地副本。但是如果最後兩個參數的功能存儲結果是地址而不是本地副本,所以結果反映在調用函數main()中。

void CalculateBoth( int num1, int num2, int*sumPtr, int *diffPtr) 
//variable types are: value  value address  address  
{ 
    *sumPtr = num1+num2; //store result of + memory pointer 
    *diffPtr= num1-num2; // by variable sumPtr, *diffPtr 
} 

注意*這裏是value at address經營者給存儲在地址值。操作結果是操作數的值;即操作數指向的地址的值。那麼,你是在內存指針由兩個變量

存儲

所以不是調用你的函數:

differenceResult = CalculateBoth (num1, num2); 

調用,比如

CalculateBoth(num1, num2, &sumResult, &differenceResult); 

另外,你做錯了,如果你在前面WRITEA differenceResult =以上函數調用表達式,因爲CalculateBoth()什麼都不返回。

+0

*讓我知道你是否需要更多的幫助,閱讀他人的答案也都說明了很好* – 2013-03-22 18:16:57

1

我想你問的是如何做到這一點,它假設你的CalculateSum()CalculateDifference()函數出現在這個代碼之前。 (你沒有在源列表中爲他們提供):

void CalculateBoth(int num1, int num2, int *sumPtr, int *diffPtr) 
{ 
    *sumPtr = CalculateSum(num1, num2); 
    *diffPtr= CalculateDifference(num1, num2); 
} 

int main() 
{ 
    int num1, num2; 
    int sumResult, differenceResult; 

    printf("Please enter a number: "); 
    scanf("%d", &num1); 
    printf("Please enter another number: "); 
    scanf("%d", &num2); 

    // invoke both sum an difference through a unified front-end 
    CalculateBoth(num1, num2, &sumResult, &differenceResult); 

    printf("the result of the sum is %d\n", sumResult); 
    printf("the result of the difference is %d\n", differenceResult); 

    return 0; 
}