对c语言指针的理解

来源:互联网 发布:装修报价软件 编辑:程序博客网 时间:2024/05/17 06:33

对于下面这一段常见的代码:

#include<stdio.h>void swap(int u, int v){    int temp;    temp = u;    u = v;    v = temp; }int main(){    int x = 2, y = 3;    printf("Originally x = %d and y = %d.\n", x, y);    swap(x, y);   //zhi    printf("Now x = %d and y = %d.\n", x, y);    return 0;}
swap函数并不能满足我们的要求:交换x和y的值。

当我们执行上面的代码时,在内存的栈(stack)上就开始变化了。main主函数所占空间,以及属于main函数的局部变量x和y的内存空间被开辟。在调用swap函数时,swap函数所占内存空间也在stack上被开辟,它的两个变量u、v接收从main函数中传过来的值,保存在相应的内存空间。见下图比较形象一点:


现在就很容易理解为什么swap函数不能交换main函数中x和y的值了,swap和main函数在stack中的运行空间就像中间隔着栅栏一样,属于两块不同的”领土”。swap运行完后,释放它的内存,和main没有一点的交互。swap不管用,因为它不能介入main的内存中,所以该让指针(pointer)上场了,让swap有能力去操纵main中的x、y。

下面用指针l来达到我们想要的效果:

#include<stdio.h>void swap(int * u, int * v)   //这里的u、v表示期望得到的是一个int型的地址{    int temp;    temp = *u;    *u = *v;    *v = temp;}int main(){    int x = 2, y = 3;    printf("Originally x = %d and y = %d.\n", x, y);    swap(&x, &y);     //这里通过&传递x和y的地址,告诉swap x 、y在哪里    printf("Now x = %d and y = %d.\n", x, y);    return 0;}

所谓地址,就好比如说你高考完去上大学时,只需要知道大学的地址,你就可以顺利地到达学校。知道了地址后,就可以到那个地址去做我们想做的事情。swap中的u、v保存了main中x和y的地址,这样当swap在操作u、v时,其实就是在操作main中的x、y。swap(&x, &y);看到&这个符号,就表示这是个地址,这里指出x、y在内存的哪个地方,传给swap后,swap也知道x、y在内存的哪个地方了,swap就可以使用在那个内存中的数据。很高兴吧,swap和main开始通信了,因为我们有通讯地址。来看内存的变化:


*u,u是一个地址,×在前就表示定位到u那个地址(go to u),在swap中就可以修改不属于它的内存。

最后总结一下:通过指针可以让两块不相干的内存作用域发生联系;想得到一个变量的地址,就在变量名前加&;*是定位符,如上面的*u和*v(u和v是地址),就是找到这些地址,然后定位到那里去。

更多详情请看:http://v.163.com/movie/2010/3/Q/J/M6U6LS8CV_M6U6O02QJ.html

PS:想想咱们国家的计算机教育,我也是醉了。

0 0
原创粉丝点击