在我正在研究的初学者程序中,我必须使用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 :(得分: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()
函数中,您需要变量num1
和num2
的和与差。当我们从CalculateBoth()
调用函数main()
时,我们传递两个结果变量的地址。
所以你在main()中的结果变量是:
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);
另外,如果你在上面的函数调用表达式前面写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)