免费注册 查看新帖 |

Chinaunix

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

[C] 拨开迷雾见真知--C语言中指针的使用(获奖名单已公布-2014-4-21) [复制链接]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
31 [报告]
发表于 2014-03-16 23:40 |只看该作者
CUTianrui007 发表于 2014-03-16 12:57
指针其实很简单,就是个地址。它有三个基本属性:地址属性,步长属性,数据格式化。


不知你这些术语哪来的?

就指针类型本身来说,指针变量和 C 中其他变量没有任何的差别,有类型(决定了可允许的值和操作)、有值、有地址,只不过是允许的值和操作不同罢了;指针型的值也是类似的。在 C 中,指针类型唯一比较复杂的地方就是和其他数据类型、操作的交互,例如指针和整数的算术运算要考虑指针所指数据类型的大小,例如某些情况下数组向指针的退化。

就指针的使用来说,最主要的有两块:复杂数据类型的构造,和函数指针提供的抽象能力。这两个在用 C 实现复杂的跨平台软件的时候是必不可少的。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
32 [报告]
发表于 2014-03-16 23:41 |只看该作者
回复 26# 寂寞小七


    内容倒是不错,不过这排版也忒糙了点。

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
33 [报告]
发表于 2014-03-17 00:27 |只看该作者
回复 19# folklore


    这句代码本身就说不通,因为对于0位置的内存地址写操作   本身就是不确定的行为。

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
34 [报告]
发表于 2014-03-17 00:46 |只看该作者
也看过几本指针的书

http://book.douban.com/subject/3012360/
http://book.douban.com/subject/21317828/

推荐看看这两本书,

今次这本 书,我看了下英文版本, 个人觉得 不是冲着“指针” 本身来的。

我个人理解的话,从易到难,我们遇到的常见的指针问题也就这样子:
1) 混淆C和C++的指针和引用的概念
2) 在C下面把变量类型完全抛开,只从地址空间考虑指针
3) 函数指针
4) 高级应用, 如Linux的VFS部分,调用函数指针实现oo设计。
...

除了问题之外,也就是一些小技巧,比如如何去利用0指针查找一个项在struct里的位置之类。

但这本书,我觉得不针对指针, 倒有些针对更上层的应用技巧了。

要知道,那些变态的old style的指针相关书籍, 可是要写一长串括号然后让你读出来其中某个星星的意思的。。。

这本书很大的部分 讲的内存操作,倒不是说书内容不好,而是不切题, 换个角度去想吧, 这本书压根就不是讲的怎么理解指针,而是在哪些地方用的列举一下而已。

当然对于书的内容我也有所保留的,

比如书里面 直接讲了
#defile NULL ((void *)0)

没有商讨的余地,也许是我们老了, 这个NULL,到底什么意思,毕竟是implement specific的,应该留模糊空间,而不是这么不留余地地讲。

而像void *这个表达式, 书里也讲得含糊,说和char *的alignment一样,但不可比较。 这也讲糊涂了, ANSI标准是不允许,但GNU就直接当char *用了,然后随便算术操作。

觉得可以严谨一些。


论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
35 [报告]
发表于 2014-03-17 08:55 |只看该作者
回复 33# to407


    这个是合法的C语句,
而且是正确的~。
只是在C语言中,
NULL(并非0)被当做为一个比较特殊的值来对待而已。
在某些系统中, 你可能可以看到:
C标准文件中有:
#define NULL ((void *)0)
。。。

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
36 [报告]
发表于 2014-03-17 11:30 |只看该作者
回复 35# folklore


    你倒是把这个标准找出来?  

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
37 [报告]
发表于 2014-03-17 13:22 |只看该作者
回复 36# to407


    我被你打败了,好吧,
也是我打错了,
我想说:

C标准文件中有:
#define NULL ((void *)-10

C语言并没有说不能写0地址,
我猜它甚至不会有不能写NULL(不管它是不是0)地址的规定。

C语言标准并不死文本,
它是基于更实的,
现实中无法规定不能写NULL地址,
不然你就无法为某些奇葩的CPU写编译器了。

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
38 [报告]
发表于 2014-03-17 13:33 |只看该作者
ISO/IEC 9899:1999

Sec 7.17

The macros are

NULL
which expands to an implementation-defined null pointer constant;



这边NULL具体什么意思,是基于实现的.  不能武断地讲 (void *)0

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
39 [报告]
发表于 2014-03-17 13:46 |只看该作者
回复 37# folklore


    1. 我认为标准不是迂腐, 还是有很多余地的, 就像c99里面提到了这个null的值是基于实现,也提到了null pointer和null pointer constant 就是以 cast 0为例的。 但不是vice versa的意思。
   
    2. 书里面 直接这么写是有问题的, 因为这个超出了标准的界限,不严谨,对读者而言也没什么好处。

    3. stddef.h确实是标准列举的头文件,  就算在我的linux x86平台下,也不是简单粗暴地实现成 (void*)0 啊
  1. #ifndef _LINUX_STDDEF_H
  2. #define _LINUX_STDDEF_H



  3. #undef NULL
  4. #if defined(__cplusplus)
  5. #define NULL 0
  6. #else
  7. #define NULL ((void *)0)
  8. #endif


  9. #endif
复制代码
4. 留这个模糊空间是有意义的, 因为0并不一定是指向物理地址x0000, 也不一定是指向所在区块的x0000偏移,具体在哪,看系统的实现。 既然0都有模糊空间,NULL就更需要这个空间了,因为0一旦cast成(void *)就不能被简单视为地址值,而标准特为其定义一个名词NULL pointer constant, 这样太明显地说,就会有鸡和蛋的先后问题。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
40 [报告]
发表于 2014-03-17 15:13 |只看该作者
看到一个指针就能写一本书,觉得自己真是低估了指针的内涵了……当前对指针的认识已被楼主写在31楼了,略过打字……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP