面试题-阿里
以下函数的结果什么?
#include <stdio.h>
void foo(int *a,int*b){
*a = *a + *b;//①
*b = *a - *b//②
*a = *a - *b;//③
}
int main(){
int a = 1,b = 2,c = 3;
foo(&a,&b);
foo(&b,&c);
foo(&c,&a);
printf("%d,%d,%d\n",a,b,c);//④
return 0;
}
一眼看有点复杂,a,b,c傻傻分不清楚。
注意:函数foo返回的具体代表哪一个值
foo(&a,&b);
这个应该没什么问题,形参和实参用的相同字母。
foo(&b,&c);
这个就需要注意了,foo返回的值改变的是b和c的值,而不是a和b。
foo(&c,&a);
和上面同理。
现在我们具体来看看,a,b,c的值是怎么改变的吧
第一次调用函数foo:
foo(&a,&b);
代表 | a | b |
---|---|---|
① | 3 | 2 |
② | 3 | 1 |
③ | 2 | 1 |
此时函数foo改变的是a,b的值。故此时a=2,b=1,c=3
第二次调用函数foo:
foo(&b,&c);
代表 | a | b |
---|---|---|
① | 4 | 3 |
② | 4 | 1 |
③ | 3 | 1 |
此时函数foo中,a,b分别对应b,c的值。原a的值不变为2,故此时a=2,b=3,c=1
第三次调用函数foo:
foo(&c,&a);
代表 | a | b |
---|---|---|
① | 3 | 2 |
② | 1 | 3 |
③ | 2 | 1 |
此时函数foo中,a,b分别对应c,a的值。原b的值不变为2,故此时a=1,b=3,c=2
可以自己测试一下:
#include <stdio.h>
void foo(int *a,int*b){
printf("%d,%d\n",*a,*b);
*a = *a + *b;
printf("%d,%d\n",*a,*b);
*b = *a - *b;
printf("%d,%d\n",*a,*b);
*a = *a - *b;
printf("%d,%d\n",*a,*b);
}
int main(){
int a = 1,b = 2,c = 3;
printf("第一次:\n");
foo(&a,&b);
printf("结果为:%d,%d,%d\n",a,b,c);
printf("第二次:\n");
foo(&b,&c);
printf("结果为:%d,%d,%d\n",a,b,c);
printf("第三次:\n");
foo(&c,&a);
printf("结果为:%d,%d,%d\n",a,b,c);
return 0;
}