关于将指针集成到程序中的建议

时间:2013-03-22 17:20:45

标签: c function pointers

在我正在研究的初学者程序中,我必须使用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;

}

有什么建议吗?

5 个答案:

答案 0 :(得分:1)

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

让我们采用向参数添加2的函数,并通过 result 变量传递结果作为示例:

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

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

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

这里结果' int'所以 *结果放在结果指向的内存中。

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

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

你说的是:嗯,取值 num1 num2 并传递ADDRESS sumResult differenceResult 作为输出参数。

答案 1 :(得分: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 by value不反映调用语句的变化,所以我们使用pass by address变量。

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

因为在main()函数中,您需要变量num1num2的和与差。当我们从CalculateBoth()调用函数main()时,我们传递两个结果变量的地址。

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

int sumResult, differenceResult;  

你来自主要的:

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

注意:变量&前面的&符号运算符sumResultdifferenceResultaddress-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);

另外,如果你在上面的函数调用表达式前面写differenceResult =,那你就错了,因为CalculateBoth()没有返回任何内容。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

称之为 -

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

不确定你在这里有什么误解。例如 -

*sumPtr = num1+num2;

由于sumPtr指向sumResult,因此会将结果写入其中。一旦函数返回,您就可以在main中打印计算值。

答案 4 :(得分:0)

我不确定整合是什么意思。我认为这就是你要找的东西:

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