考虑这样一个问题,如果要交换两个变量的值,怎么样定义函数,首先我们得有一个中间变量temp,然后通过三次赋值(见代码)可以完成这个函数。那么问题来了,调用函数中的值可以因为被调函数而改变吗?答案是否定的。请看如下代码:
<span style="font-size:18px;">void exchange(int x,int y);//函数申明
void main()
{
int s=6;
int t=7;
printf("调用之前s和t的值:%d %d\n",s,t);//调用之前s和t的值
exchange(s,t);
printf("调用之后s和t的值:%d %d\n",s,t);//调用之后s和t的值
}
void exchange(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;//交换x和y的值
}</span>
先来分析上面的代码,exchange()的功能是交换两个数的值,然后在调用函数中使用该函数就可以交换两个数的值了,但事实并非如此,因为是s和t是main函数私有的,而x和y是属于exchange()的变量,他们相互独立的,因此交换x和y的值无法改变s和t的值。那如何来完成交换呢,指针就可以完成这个交换值的过程,代码如下:
<span style="font-size:18px;">void exchange(int x,int y);//函数申明
void main()
{
int s=6;
int t=7;
printf("调用之前s和t的值:%d %d\n",s,t);//调用之前s和t的值
exchange(&s,&t);
printf("调用之后s和t的值:%d %d\n",s,t);//调用之后s和t的值
}
void exchange(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;//交换x和y的值
}</span>
在这段代码中,在调用函数使用了地址运算符&,&s和&t分别代表s和t这两个变量的地址,也就是exchange()在被调用的时候传了地址而不是变量本身,这样变量s和t就可以访问到exchange()这个函数了。在被调用函数中做的三次赋值运算指的是指针变量的赋值运算 ,*x指向了s,x就是&s(绑定),也就是说*x就代表指向s这个变量地址中的值。再说明白点就是*x就代表了s的值。这样一来,s和t通过地址运算符传给被调函数地址,通过*这个间接运算符就可以使用s和t的值了。
再来解释下地址运算符和间接运算符:*a或者*0xef098ea代表着一个变量或者一个地址在内存中存储的值,&a的意思就是a这个变量的地址。形象的说要寻找一个走散的人,你需要的是抓住他的某些重要特征(类似地址)而不是他的所有信息,如何找到这些重要的信息呢,得先去公安局(类似指针)查他的一些档案和记录,这样就可以找到失散的那个人。
指针变量的使用:(1)声明(2)绑定地址(3)引用。例子如下:
int *p;//声明
p=&a;//绑定
*p=a;//引用