|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
小白来请教啦?我想问的是swap函数内不是经过了地址交换了吗?为什么main函数里面第二个printf函数的输出结果还是和第一个printf函数输出一样呢,这里第二个printf函数的变量为*p1,*p2。。(为了图方便,我这里设定a=4,b=5)!
代码如下:
#include <stdio.h>
int main()
{
void swap(int *p1,int *p2);
int *p1,*p2,a,b;
a = 4;b = 5;
p1 = &a;
p2 = &b;
if(a<b)
{
swap(p1,p2);
}
printf("a=%d,b=%d\n",a,b);
printf("max = %d,min = %d",*p1,*p2);
return 0;
}
void swap(int *p1,int *p2)
{
int *p; p = p1; p1 = p2;p2 = p;
}
运行结果如下:
a=4,b=5
max = 4,min = 5
(我用的是devc++编译器!)
- #include <stdio.h>
- int main()
- {
- void swap(int* p1, int* p2);
- int* p1, * p2, a, b;
- a = 4; b = 5;
- p1 = &a;
- p2 = &b;
- if (a < b)
- {
- swap(&p1, &p2);
- }
- printf("a=%d,b=%d\n", a, b);
- printf("max = %d,min = %d", *p1, *p2);
- return 0;
- }
- void swap(int** p1, int** p2)
- {
- int* p; p = *p1; *p1 = *p2; *p2 = p;
- }
复制代码
建议从函数调用栈的角度解释
程序运行时,假定产生一个函数调用栈。
在主函数中执行另一函数时,会想堆栈中压入一个数据备份。
当这个备份执行完毕后,备份出栈,返回主函数。
你的主函数里面传入的参数是 :int *p1, * p2
到了堆栈里面函数得到的参数是:int *m=&a, int *n = &b,它们也指向对应数据;
此时函数内所有的操作只针对指针m,n进行,不会修改主函数传入的参数,这一部分也可以解释作用域的问题。
如果传入的是二级指针,堆栈得到的参数是:int** m = &p1,** n = &p2;
通过对二级指针解引用:*m = p1 = &a,*n = p2 = &b 获得主函数中指针p1,p2所指向的地址,进而利用临时一级指针变量修改主函数中一级指针指向的地址。
|
|