Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181980
  • 博文数量: 48
  • 博客积分: 262
  • 博客等级: 入伍新兵
  • 技术积分: 327
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-10 16:37
文章分类

全部博文(48)

文章存档

2012年(46)

2011年(2)

分类:

2012-03-07 21:24:38

  本人菜鸟 ,以前总有这样这种观念,凡是指针作为参数传入函数,函数执行完毕之后,指针肯定变了,因为直接对地址进行操作吗,不知道为什么会有这样的想当然的想法。看了GFree_Wind算法实现:返回单链表的倒数第n个节点 的一个评论之后,我才恍然大悟。指针传入函数的时候,它本身也是作为一个变量传入的,根据函数的原理,会再创建一个临时变量作为传入变量的副本,而函数在执行时真正操作的是这个副本,这样的话实际上在函数执行过后指针本身是不变的。那到底是什么东西变了呢,真正变了的东西是这个指针指向的数据. 下面是一个例子
 
  1. #include <iostream>
  2. using namespace std;

  3. int func1(int* p);
  4. int main()
  5. {
  6.      
  7.      int a = 1;
  8.      int *p = &a;
  9.      
  10.      cout << "before : the address is " << p << " a = " << a << endl;
  11.      
  12.      func1(p);
  13.      
  14.      cout << "after : the address is " << p << " a = " << a << endl;
  15.      
  16.      system("pause");
  17.      
  18.      return 0;
  19. }

  20. int func1(int *p)
  21. {
  22.      (*p)++;
  23.      p++;
  24. }

执行结果如下:

before : the address is 0x22ff74 a = 1
after  : the address is 0x22ff74 a = 2

由结果可知:指针本身并没有变,变得是指针指向的内容

看来以前对指针的本质了解的不够啊,其实指针本身也就是一个变量,只不过它的值是地址罢了,了解了这一点就不会犯类似的错误了...看来看一些大牛的东西还是非常有用的,哈哈哈哈

阅读(891) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~