指针作为函数的参数
各位小伙伴学习了指针之后是不是跟我一样,一脸蒙逼这玩意在讲啥,我也是经过了很长时间的思考才勉强懂了指针的意思。
指针其实就是一种变量,只是它与普通变量不太一样,普通变量存放的是一个实实在在的值,而它存放的却是一个值的地址。
计算机要对数据进行处理是需要知道这个数据它在哪里的,也就是这个数据的地址。而我们平时写代码,例如:设置一个变量a=2,其实当我们写了这个a之后,计算机就申请了一个空间给a了,然后才可以给a赋值,也就是将这个值放在这个空间里。
而当我们写了一个指针之后,计算机也是会申请一个空间的,而这个空间它不是用来存放具体的数据的,而是这个数据的地址,通过这个地址我们就可以找到相应的数据了。
问题来了,你是不是这样很多此一举,将空间放值不就行了吗?为什么还要来放地址,然后再通过地址来找到对应的值。但是这样可以方便我们调用数据,特别是将指针作为函数参数的时候。下面我们就通过一个例子来感受一下吧。
#include<stdio.h>
void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py);
int main()
{
int a=1,b=2;
int *pa=&a,*pb=&b;
swap1(a,b);
printf("经过变换之后:a=%d,b=%d\n",a,b);
a=1;
b=2;
swap2(pa,pb);
printf("\n经过变换之后:a=%d,b=%d\n",a,b);
a=1;
b=2;
swap3(pa,pb);
printf("\n经过变换之后:a=%d,b=%d\n",a,b);
return 0;
}
void swap1(int x,int y) //将普通的变量作为形参
{
int t;
t=x;
x=y;
y=t;
}
void swap2(int *px,int *py) //将指针作为形参
{
int t;
t=*px;
*px=*py;
*py=t;
}
void swap3(int *px,int *py) //将指针作为形参
{
int *pt;
pt=px;
px=py;
py=pt;
}
运行结果如下:
经过变换之后:a=1,b=2
经过变换之后:a=2,b=1
经过变换之后:a=1,b=2
从结果中我们可以看出swap1()和swap3()并没有让a,b的值改变,而swap2()则可以。
swap1()采用的是将普通变量作为形参,当main函数运行到swap1函数时,计算机其实是再申请了x和y两块空间,而a和b的值分别赋值给x和y,而我们可以看出swap1中是对x和y中的值进行调换,所以a和b的值其实并没有被改变过,a和b在swap中的作用也只是对x和y赋值。
swap2中是将pa和pb中的值分别传给px和py,也就是分别将a和b的地址传给px和py,而因此px和py就分别指向了a和b,px与py众所周知分别表示a和b的值,所以swap2中实实在在对a和b进行了调换。
swap3也是指针作为形参为什么它就不能将a和b的值调换呢?我们可以看到它们调换的是指针px与py也就是调换了指针内部的地址,但是对应的地址里面的值还是没有调换啊,其实就是调换了px与py的指向而已,而地址里的东西还是没有变化(这里是不是贼烧脑,我当初看的时候就是绕晕在里面的)
写的不好的请各位老铁多多指点呀,关于指针的我之后还会继续发,关注我就可以看到我下期内容啦!!