函数中变量有各自的作用域,怎样通过函数改变作用域意外的函数。为了讨论这个问题,我们使用很多资料上介绍的例子。

运行结果

这与我们上一节论述结果一样,swap(int x,int y)没有实现想x,y值得交换。虽然swap(int x,int y)内部x、y的值进行了交换,main函数中x、y的值并没有发生变化。
怎样实现 x,y使用一个函数实现两个变量的值发生交换。在这我们引入指针参数,即将指针作为参数,也就是以前我们传递的变量的值,现在我们传递变量地址。我们改写swap(int x, int y)函数.

运行结果

我们使用swap(int *pa, int *pb)代替swap(int x, int y)我们使用int *代替 int x变量。 int *是指针。
也就地址。&是取地符,怎么理解&取地址符??
这个就必须理解计算机体系结构、计算机组成原理概念。我建议大家学习C51单片机。这是因为前两个专业课程过于庞大,如果你只是做一份工作,而不是在研究所工作。那么学习前两个专业也不是当下之急。而前内容太多,不容易学习。C51已经是一个完整计算机。包括运算器、存储器、控制器、输入输出等等!
而且C51内容也比较少,一个基本的C51单片机说明书也就50页左右。非常容易学习。另外C51在中国历史也比较长。资料特别多。所以推荐您掌握C51。
现在我们再来讨论&。我来了解一下C语言最普通 的语句-----变量声明语句.
int x;
x=100;
我们一般的解释是声明一个变量 x, x的值是100。这只是一般字面的解释。在计算机的数据区ram中画出两个字节空间,使用x作为该空间的引用。x=10是在该空间存入10.
我们通过以下实验了解这个概念

根据以上在代码,在VC单步调试。我们看到x的地址是0x0012ff7c。在该地中存入的数据值是100.也就说任何变量都是有地址的,值是存储在该地中。这也是为什么变量在使用之前都应该初始化。因为分配这个变量的内存的值是随机的。
如果我们在这个地址中存入200。x的值也就是200了。

这就是swap(int *px,int *py)为什么能改变main函数中的int x, int y变量的值。因为我们为swap函数传入了x、y的地址。
我们在了解以下两个概念*px、px。 px是地址。*px是地址中变量的值。也就是解引用。我们看看以下代码:
int *px;
int x;
px = &x;
x=100;
/********************************************/
px = &x;
是将px的值赋值为变量 x 的地址,x=100;执行完成后。*px的值为多少?很明显*px的值为100;
很明显,只要了解数据区ram概念,就不难理解指针,以及为什么指针会改变不属于自己作用域的变量。传真只能传递一个值。但是一个地址有可能传递很多值。因为计算机中内存地址编址是唯一的!