刚刚对指针做了基础的学习,那么指针的作用在哪里呢,我们就用Swap函数作一下分析。
假如我们要交换a和b的值
void Swap(int a, int b)//交换不成功
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前:%d,%d\n",a,b)
Swap(a,b)
printf("交换后:%d,%d\n",a,b)
return 0;
}
我们来看图片
由此看出地址是不同的,在Swap函数中a和b的值交换,并不会影响到main中的变量,在这里仅仅是按值(复制)传递。
如果想在Swap函数中修改main中的值,必须突破不同函数间的限制,那我们必须要引入指针,来看第二个。
void Swap(int *p1,int *p2)//交换不成功
{
int *tmp = p1;
p1 = p2;
p2 = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);
printf("%d %d\n",a,b)
return 0;
}
我们发现依然不成功,来看一下图。
由图可以看出,p1和p2的内容确实交换了,但是a,b的值并没有交换,想要交换我们必须得解引用。
来看第三版本
void Swap(int *p1,int *p2)//程序崩溃
{
int *tmp;
*tmp=*p1;
*p1=*p2
*p2=*tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
上面的代码在运行时,程序崩溃。在编译时编译器会提醒你使用了未初始化的局部变量。这是因为我们使用了野指针。
野指针:也被叫做悬挂指针,是我们没有访问权限的地址,这个地址有可能是不存在,也有可能是存在但我们不能访问。那么我们把野指针消除,来看第四种:
void Swap(int *p1,int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前:%d,%d\n"a,b);
Swap(&a,&b);
printf("交换后:%d,%d\n"a,b);
return 0;
}
来看执行结果:
来看一下过程
结论:被调用函数的改变要想影响到调用函数,必须要1、传指针2、解引用(访问)。
终于写完了。。。