对c语言指针的理解

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

#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:想想咱们国家的计算机教育,我也是醉了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值