@努力的张张 的C#练习
数组 指针地址传递 Swap函数
首先,我们先来看一下普通值传递和地址传递的区别
- 函数间普通值传递
上代码:
#include<stdio.h>
#include<stdlib.h>
void Swap1(int p1,int p2)
{
int t=p1;
p1=p2;
p2=t;
}
int main()
{
int a;
int b;
a=10;
b=20;
Swap1(a,b);
printf("%d %d\n",a,b);
return 0;
}
运行结果:
结果分析:
我们知道,变量名可以相同,但他们的存储地址一定是唯一的,所以,查看一下Swap中的p1,p2和main中的a,b地址;
可以看到,这两组变量之间除了值相同外,地址是完全不同的,而想要改变某一变量,是一定要到变量地址单元去的,因此,即使在Swap1函数中交换了p1,p2的值,实际上对实参a,b没有任何影响。
- 通过指针进行地址传递
(1)使用野指针(野指针,悬挂指针,你不能访问,可能有地址不能访问,也可能是不存在的地址)
#include<stdio.h>
#include<stdlib.h>
void Swap2(int *p1,int *p2)
{
int *t=p1;
p1=p2;
p2=t;
}
int main()
{
int a;
int b;
a=10;
b=20;
Swap2(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
运行结果:
结果分析:
可以看到,p1,p2指针确实指向了a,b,但是只通过指针t交换了Swap2中的p1和p2的地址指向,实际a,b并没有变化,这是因为没有解引用,并未真正去到a,b的存储单元去。并且在这里的t指针是个野指针,是很危险的存在,是不能够访问的,所以此段代码也非常不安全。
(2)使用指针,且解引用
代码:
#include<stdio.h>
#include<stdlib.h>
void Swap3(int *p1,int *p2)
{
int t=*p1;
*p1=*p2;
*p2=t;
}
int main()
{
int a;
int b;
a=10;
b=20;
Swap3(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
运行结果:
结果分析:
可以看到,成功交换了a,b。
结论
在一个函数中想要修改另一个函数中的变量,必须使用指针,而且要解引用!
e.g scanf()函数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)