2

在我正在处理的初学者程序中,我必须使用 3 个函数来获取两个参数的和和差。在第三个函数中,我必须将结果存储在两个指针中。我的问题是,我无法成功地将第三个功能集成到 main.js 中。

我的主要功能如下:

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;

}

有什么建议么?

4

5 回答 5

1

指针(通常)用于传递的不是参数值,而是参数值所在的内存地址。这允许您修改参数值。

让我们以将 2 加到参数并通过结果变量传递结果的函数为例:

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

在这种情况下,您传递结果值,但结果中的任何更改都将是本地的。相反,指针告诉的不是值,而是值所在的地址。

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

这里result 'address of int' 所以*result位于result指向的内存中。

要在函数中使用指针,您应该在内存中放置结果:

int value = 10;
int result = 0;

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

因此,您需要使用相同的前 2 个参数调用 CalculateBoth,但结果将通过第 3 个和第 4 个参数传递,它们是指向您要放置输出参数的位置(包含它们的地址)的指针。

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

你在说:好吧,取num1num2的值,并将sumResultdifferenceResult的地址作为输出参数传递。

于 2013-03-22T17:42:14.000 回答
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;
}
于 2013-03-22T18:07:06.750 回答
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意味着它不返回(或者说返回无效)。

但是你的功能CalculateBoth()很好它计算。(两件事)

在 C 编程中,我们不能从函数中返回一个以上的参数。在这种情况下,指针非常有用。所以最后你的参数实际上是函数CalculateBoth()太阳和差异的输出参数。

喜欢(再次阅读评论):

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

因为按值传递不反映调用语句的变化,所以我们使用按地址变量传递。

指针是可以保存其他变量地址的变量。

因为在main()函数中,您需要两个变量的和和差,num1并且num2. 当我们调用函数时,我们传递了两个结果变量的CalculateBoth()地址main()

所以你在 main() 中的结果变量是:

int sumResult, differenceResult;  

你主要喜欢:

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

注意&:变量前面的和号运算符sumResultdifferenceResult地址运算符给出其操作数的地址。通过简单地编写变量名,您正在传递值,但如果您使用&运算符,您将传递变量的地址。

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
}

注意*这里是地址运算符的值给出了存储在地址中的值。操作的结果是操作数寻址的值;也就是说,它的操作数指向的地址处的值。所以你通过两个变量存储在内存指针

所以改为调用你的函数:

differenceResult = CalculateBoth (num1, num2);

打电话

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

differenceResult =另外,如果你在上面的函数调用表达式前面写a,你做错了,因为CalculateBoth()什么都不返回。

于 2013-03-22T17:51:49.050 回答
0

Call it like -

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

Not sure what you are misunderstanding here. For example -

*sumPtr = num1+num2;

Since sumPtr is pointing to sumResult, the result is acutally written to it. And you can print the calculated values in main once the function returns.

于 2013-03-22T17:24:43.610 回答
0

I am not sure what do you mean by integrate. I think this is what you are looking for:

CalculateBoth(num1, num2, &sumResult, &differenceResult)
于 2013-03-22T17:25:05.060 回答