织梦CMS - 轻松建站从此开始!

罗索

真正明白C语言二级指针

落鹤生 发布于 2012-02-09 15:42 点击:次 
指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也经常用到:比如说对于字符串的处理,函数参数的“值,结果传递”等,对于二级指针或者多级指针,我想理解起来也是比较容易的,比如二级指针就是指向指针的指针.....n级指针就是....
TAG:

指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也经常用到:比如说对于字符串的处理,函数参数的“值,结果传递”等,对于二级指针或者多级指针,我想理解起来也是比较容易的,比如二级指针就是指向指针的指针.....n级指针就是....

                                      p    *p   **p
                                      ---  ---  ----
                                      | |->| |->|  |
                                      ---  ---  |  |
                                                |  |
                                               ----

但是可能大家比较不容易理解的是,二级指针或者多级指针用在哪里呢?怎么使用呢?有没有必要用呢?

    现在我就谈谈C指针的比较经常用到的地方:

我们都知道C语言中函数传递参数都是传递"值"的,如下:

  1. void fun(void
  2.      int tmp = 0; 
  3.      change(tmp); 
  4.      printf("################ tmp = %d /n"); 
  5.      return ; 
  6. void change(int tmp_t) 
  7.    tmp_t =1; 
  8.    return

这个时候fun()中打印出来的tmp值还是0,因为我们传递的是“值”,如果你想在函数change()中修改这个tmp的值能在fun()中生效的话,那么就需要用指针来传递了如下:

  1. void fun(void
  2.      int tmp = 0; 
  3.      change(&tmp); 
  4.      printf("################ tmp = %d /n"); 
  5.      return ; 
  6.  
  7. void change(int *tmp_t) 
  8.    *tmp_t =1; 
  9.    return

这个时候fun()中打印出来的tmp值就是1了,因为我们此时传进来的是tmp的地址,所以我们在change()中tmp_t就是tmp的地址了,而对于*tmp_t的操作其实就是对tmp的操作了。

到这里的时候我们可以试想一下,我们通过传递指针来达到修改一个值的目的,那么当你需要修改一个指针的时候呢,这个时候我们就需要指针的指针了,如下:

  1. int fun(void) 
  2.      int *buf ; 
  3.      int ret ; 
  4.      ret = mem_init(&buf); 
  5.      return ret; 
  6.  
  7. int mem_init(int **buf_t) 
  8.   *buf_t = malloc(100); 
  9.   return 1; 

通过上面我们可以发现,fun()函数通过调用men_init()函数来实现给buf分配内存空间的目的。首先buf是我们定义的一个指 针,&buf则是指向buf的指针(二级指针),我们通过把&buf传递个men_init()函数,那么此时二级指针buf_t=& amp;buf了,所以说buf_t是指向buf的指针,那么对于*buf_t的操作其实就是对buf的操作了,这样fun()就可以通过 men_init()来分配内存了。

(补充一点:对于定义的int **buf_t中,二级指针buf_t=&buf,指向为buf(还是一个指针),一级指针*buf_t=buf,指向为*buf,值**buf_t= *buf)

对于n级指针的使用也是差不多这样了

这是本人的一点理解,如果有不对,希望大家多多指导。

(liaoxinmeng)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201202/15679.html]
本文出处:CSDN博客 作者:liaoxinmeng 原文
顶一下
(0)
0%
踩一下
(4)
100%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容