我对递归函数和跟踪有基本的了解,但是当我尝试跟踪以下程序时,有些事情会变得混乱:
#include <stdio.h>
#include <stdlib.h>
int f1(int *a, int c);
int main(void) {
int a=2, b=3, c=4, d=5;
a = f1(&c, f1(&b,d));
printf("a= %d b= %d c= %d d= %d\n",a,b,c,d);
system("pause");
return 0;
}
int f1(int *a, int c) {
*a = c - 2;
c = c*2 - (*a);
printf("a= %d c= %d\n", *a, c);
return c - *a;
}
当我追踪时,我得到两次调用f,f(4,4)和f(3,5)。我可以正确跟踪返回值和f函数中的printf语句。但是当我写出来时,main中的最终printf给了我a = 4 b = 3 c = 2 d = 5我最终得到了c = 4 ...即使我已经检查了我的工作。当我调试时,我无法找到主“c”的值发生变化,我当然没有在主要的“c”的代码中看到任何算术。
提前致谢...我感觉它很小,我忽略了。
答案 0 :(得分:1)
main()
的{{1}}将会改变:
c
在对int f1(int *a, int c) {
*a = c - 2; /* <-- */
c = c*2 - (*a);
printf("a= %d c= %d\n", *a, c);
return c - *a;
}
的外部调用中,您将指针传递给f1
。在c
中,当您指定f1
时,它会更新*a
指向的任何内容,即a
。
答案 1 :(得分:1)
试试这样:
#include <stdio.h>
#include <stdlib.h>
int f1(int *a, int c, const char *sa);
int main(void) {
int a=2, b=3, c=4, d=5;
a = f1(&c, f1(&b,d, "main.b"), "main.c");
printf("a= %d b= %d c= %d d= %d\n",a,b,c,d);
system("pause");
return 0;
}
int f1(int *a, int c, const char *sa) {
printf("%d: set %s from %d to %d\n", __LINE__, sa, *a, c - 2);
*a = c - 2;
c = c*2 - (*a);
printf("a= %d c= %d\n", *a, c);
return c - *a;
}
<强>输出强>
16: set main.b from 3 to 3
a= 3 c= 7
16: set main.c from 4 to 2
a= 2 c= 6
a= 4 b= 3 c= 2 d= 5
答案 2 :(得分:0)
致电a = f1(&c, f1(&b,d));
将c
的地址传递给f1()
,并在该功能中第一行
*a = c - 2;
更改c
的值。 *a
是指c
的值。