请问谁能帮忙讲解一下这道程序吗!萌新想起来有点绕!谢谢!

#include<stdio.h>
void fun(int *a,int *b,int *c)
{
int *t;
t=a;a=b;b=t;
*t=*b;*b=*c;*c=*t;
printf("%d%d%d\n",*a,*b,*c);
}
int main()
{
int a=5,b=7,c=3;
int *p1=&a,*p2=&b,*p3=&c;
fun(p1,p2,p3);
printf("%d%d%d",a,b,c);
}

解答如下:

注:解答中使用的形如a->a=5的语句,翻译为:指针a指向整型变量a,整型变量a=5

文字版如下:

#include<stdio.h>

void fun(int *a, int *b, int *c)

{

//此处形参a,b,c就相当于指针p1,p2,p3

int *t;//⑤定义了一个指针变量t

t = a; a = b; b = t;//⑥另说

*t = *b; *b = *c; *c = *t;//⑦另说

printf("%d%d%d\n", *a, *b, *c);//⑧分别输出指针a,b,c所对应的值:7,3,3

//⑨fun执行结束,转到main函数

}

int main()

{

//①程序从main函数开始执行

int a = 5, b = 7, c = 3;//②定义了三个整型变量a,b,c并分别赋值5,7,3

int *p1 = &a, *p2 = &b, *p3 = &c;//③定义了三个指针p1,p2,p3分别指向变量a,b,c

fun(p1, p2, p3);//④将p1,p2,p3作为实参传入函数fun,转到fun执行

printf("%d%d%d", a, b, c);//⑩输出a,b,c的值,3,7,3

}

/*

⑤a->a=5  b->b=7  c->c=3  t

⑥t->a=5  a->b=7  b->a=5  c->c=3此时*t=5,*a=7,*b=5,*c=3

⑦*t=*b执行后*t=5,*b=*c执行完后*b=3(注意此时指针b是指向整型变量a的,*b=3时就将整型变量a的值更改为了3,即a=3)

执行*c=*t后*c=3(由⑥可知t和b同时指向a,而a已经变为了3,所以*t也为3)

至此:*a=7,*b=3,*c=3,而整型变量a=3,b=7,c=3

*/

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-05-13

把函数中*t=*b;*b=*c;*c=*t;这段注释掉前后对比下,应该就理解的差不多啦:

第2个回答  2021-05-12

#include<stdio.h>

void fun(int *a,int *b,int *c)

{

    int *t;

    t=a;     // *t = 5;

    a=b;     // *a = 7

    b=t;     // *b = 5, b, t指向同一个地址初识a的地址

    *t=*b;     // *t = *b = 5

    *b=*c;     // *b = 3, 因为b, t 指向同一个地址所以*t = 3

    *c=*t;     // *c = 3

    printf("%d%d%d\n",*a,*b,*c);     // *a = 7; *b = 3; *c=3

}

第3个回答  2021-05-13
#include<stdio.h>
void fun(int *a,int *b,int *c)//&a,&b,&c ==>对应5,7,3
{
int *t;
t=a;//t = &a;
a=b;//a = &b;
b=t;//b = &a; 在这三步之后并没有交换main函数中的值,只是形参传入顺序变为a = &b,b = &a,c = &c
*t=*b; //*t = *b = *(&a) = 5
*b=*c;//*b = *(&c) = 3 由于t与b指向同一段内存,所以*t = 3 ==>>main函数中a等于3
*c=*t;//*c = 3 ==>>main函数中的c等于3
printf("%d%d%d\n",*a,*b,*c);//由于a保存的是b的地址,所以*a = 7,*b被赋值为3,*c被赋值为3
}
int main()
{
int a=5,b=7,c=3;
int *p1=&a,*p2=&b,*p3=&c;
fun(p1,p2,p3);//&a,&b,&c
printf("%d%d%d",a,b,c);//输出3,7,3
}
所以最终输出:7 3 5
3 7 5本回答被提问者采纳
第4个回答  2021-05-12
#include<stdio.h>
void fun(int *a,int *b,int *c)
{
int *t;
t=a;
a=b;
b=t;
/* 上面几条语句:
* 指针a与b的交换,也就是说 现在 a == p2, b == p1, c 不变== p3
* *a == 7
* *b==5
* *c==3
* b和t 指向是同一个地址
* */

*t=*b; // 这条语句相当于啥也没干,因为 t 和 b 的 地址一样 相当于 *b==*b
*b=*c; // 现在 b和 t 的内容 == *c == 3 也就是原来的 因为b==p1 所以 指针p1的内容*p1==3
*c=*t; // 经过上面那个语句,*t的值自然==3 赋值后 *c 也==3了 c一直没有被动过,所以 c 和p3一直指向同一块内存,改变内容后,*c ==*p3==3

printf("%d%d%d\n",*a,*b,*c);
}
int main()
{
int a=5,b=7,c=3;
int *p1=&a,*p2=&b,*p3=&c;
fun(p1,p2,p3);
printf("%d%d%d",a,b,c);
}
相似回答