免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pprpg
打印 上一主题 下一主题

[C] ( 转 )Linus Torvalds:大多黑客甚至连指针都未理解 [复制链接]

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
91 [报告]
发表于 2013-01-12 00:05 |只看该作者
本帖最后由 captivated 于 2013-01-12 00:25 编辑

回复 90# cokeboL


    不是的.
    我函数的第一个参数是 node_t **h, 这表示调用方不需要有头节点,
    调用方只需要创建一个头指针即可.

  1.     node_t *list = NULL;

  2.     while (1)
  3.     {
  4.         ...
  5.         list_append(&list, data, size);
  6.         ...
  7.     }
复制代码
就可以了.

    如果, list_append的原型是这样子:
    int list_append(node_t *h, void *data, int size);
    那么显然在list_append函数中无法改变调用方的头指针, 于是必须要调用方预先提供一个头节点才行.

    如果, list_append的原型是这样子:
    node_t *list_append(node_t *h, void *data, int size);
    那么, 如果list_append中调用malloc失败, 你将如何告诉调用方你的函数失败? -- 返回NULL是不好的(因为这样调用方要自己用多一个临时指针来判断调用是否失败).

    那么, 我们最终的原型是
    int list_append(node_t **h, void *data, int size);
    这代表, 在list_append中, 那么第一次插入的数据就是头节点(也即, 用户传入的头指针是NULL).
    所以, 在list_append中, 你需要判断 *h 究竟是不是NULL. 那么使用一级指针的做法如下:

  1.     node_t *tmp = *h;
  2.     if (*h == NULL)
  3.     {
  4.         *h = n;
  5.     }
  6.     else
  7.     {
  8.         while (tmp->next != NULL)
  9.              tmp = tmp->next;

  10.         tmp->next = n;
  11.     }
  12.    
复制代码
那么对比一下使用二级指针的做法:
  1.    node_t **cur = h;
  2.    while (*cur)
  3.         cur = &(*cur)->next;
  4.    *cur = n;
复制代码
首先, 二级指针的代码简洁了很多. 其次, 二级指针很明显少了一个判断.


    其实, 二级指针之于一级指针, 其优势就是在绝大多数情况下, 都能省略掉使用一级指针时那个多余(exceptional)的判断. 当然, 我这个实例的话有些不够说服力, 因为毕竟不循环单链表尾插什么的, 不过是写着玩儿的. 但是, 这个例子毫无疑问确实地体现了二级指针之于一级指针的真正优点所在[如果在系统性能至关重要并且频繁调用的地方, 这个省去的判断是很重要的, 它能提高CPU分支预测的命中率].

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
92 [报告]
发表于 2013-01-12 12:52 |只看该作者
回复 91# captivated

我也喜欢链表都传二级指针,这样至少调用链表函数那一组的格式统一,心里舒服
   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
93 [报告]
发表于 2013-01-12 12:58 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP