我试图使用递归返回2个数字的数字总和。我认为我的算法没问题,但是我的指针并不是很好,当他们指向main
中声明的变量时,我不明白他们为什么会显示奇怪的值(比如当声明变量时)它们是0
。
这是我的代码:
int get_sums(int **fp, int **sp, int n1, int n2) {
printf("fp: %d\n", fp);
printf("sp: %d\n", sp);
printf("n1: %d\n", n1);
printf("n2: %d\n", n2);
if (n1 == 0) {
return 0;
}
*fp += (n1 % 10);
*sp += (n2 % 10);
return get_sums(&fp, &sp, n1 / 10, n2 / 10);
}
int main(void) {
int f = 0, s = 0;
int *fp = &f;
int *sp = &s;
int first = 123, second = 456;
get_sums(&fp, &sp, first, second);
printf("First sum: %d\nSecond sum: %d\n", *fp, *sp);
return 0;
}
答案 0 :(得分:2)
您有多个问题:
你正在使用2级间接,其中一个就足够了
您没有取消引用将值传递给printf
的指针
你应该递归地传递指针而不是它们的地址,但是用结果的地址调用函数。
你应该递归,直到两个数字完全被摧毁
您应该为编译器启用更多警告,以帮助您避免此类错误:例如gcc -Wall
。
以下是更正后的版本:
#include <stdio.h>
void get_sums(int *fp, int *sp, int n1, int n2) {
printf("fp: %d\n", *fp);
printf("sp: %d\n", *sp);
printf("n1: %d\n", n1);
printf("n2: %d\n", n2);
if (n1 == 0 && n2 == 0) {
return;
}
*fp += n1 % 10;
*sp += n2 % 10;
get_sums(fp, sp, n1 / 10, n2 / 10);
}
int main(void) {
int f = 0, s = 0;
int first = 123, second = 456;
get_sums(&f, &s, first, second);
printf("First sum: %d\nSecond sum: %d\n", f, s);
return 0;
}
答案 1 :(得分:1)
你不需要通过指针传递指针。:)
考虑到该功能将始终返回0.
它可以看作以下方式
#include <stdio.h>
void get_sums( int *fp, int *sp, int n1, int n2)
{
printf("fp: %d\n", *fp);
printf("sp: %d\n", *sp);
printf("n1: %d\n", n1);
printf("n2: %d\n", n2);
if ( n1 != 0 && n2 != 0 )
{
*fp += (n1 % 10);
*sp += (n2 % 10);
get_sums( fp, sp, n1 / 10, n2 / 10);
}
}
int main(void)
{
int f = 0, s = 0;
int *fp = &f;
int *sp = &s;
int first = 123, second = 456;
get_sums( fp, sp, first, second);
printf("First sum: %d\nSecond sum: %d\n", *fp, *sp);
return 0;
}
程序输出
fp: 0
sp: 0
n1: 123
n2: 456
fp: 3
sp: 6
n1: 12
n2: 45
fp: 5
sp: 11
n1: 1
n2: 4
fp: 6
sp: 15
n1: 0
n2: 0
First sum: 6
Second sum: 15