免费注册 查看新帖 |

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
41 [报告]
发表于 2014-03-17 15:26 |只看该作者
to407 发表于 2014-03-17 13:33
这边NULL具体什么意思,是基于实现的.  不能武断地讲 (void *)0


folklore 有说在某些系统中嘛。不过,确实在有些系统下 NULL 不是 0。

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


    是啊, 我也没针对他的发言, 我是针对原书里提到的这段话, 个人评论的。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
43 [报告]
发表于 2014-03-17 16:59 |只看该作者
看到folklore 老大的那句话,心里有一万个core dump飘出来
虽然cpu的物理地址0是可以读写的,但是linux里面是把虚拟地址里的0地址当作了非法地址的

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
44 [报告]
发表于 2014-03-17 17:13 |只看该作者
  这样容易让人产生误解

回复 9# fender0107401


   

论坛徽章:
11
巨蟹座
日期:2013-12-23 11:12:14双子座
日期:2014-08-28 09:14:55子鼠
日期:2014-07-25 16:21:22摩羯座
日期:2014-07-23 15:17:47摩羯座
日期:2014-05-30 13:09:05午马
日期:2014-04-30 18:10:00天秤座
日期:2014-04-25 12:12:00申猴
日期:2014-04-22 11:30:15午马
日期:2014-03-07 16:06:40辰龙
日期:2013-12-25 18:36:00摩羯座
日期:2014-09-02 17:00:55
45 [报告]
发表于 2014-03-18 00:39 |只看该作者
关注!NULL
c11的55页66注释
The macro NULL is defined in <stddef.h>(and other headers) as a null pointer constant
在stddef.h中
The macros are
NULL
which expands to an implementation-defined null pointer constant

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
46 [报告]
发表于 2014-03-18 10:32 |只看该作者
谈谈我对C语言指针的一点看法,
首先声明,我不是C语言专家,只是对使用C有点经验和理解,所以不排除有些错误的地方。
指针在很多语言中都存在,比如:PASCAL/DELPHI,其指针的能力,一点也不比C弱,只是写法不同而已,所以,很多PASCAL/DELPHI技术狂热分子,对指针是C语言的精华,向来不服,用各种对比来证明PASCA/DELPHI的指针能力,但指针在PASCAL系列的语言里,其使用频率和范围,远远没有C语言高,其原因是语言的设计理念不同,因为PASCAL系语言有内置的字符串处理和动态数组类型,所以,大部分情况下,已经不需要使用指针来做处理,而C语言因为缺乏内置的字符串类型和原生的动态数组类型,所以,需要指针来处理这些数据,如果没有指针,那C语言估计就是个废物语言。

由于指针在C语言程序里,无处不在,所以,如果不深入理解C指针,还真是没办法写出程序。

对于指针的理解和使用,每个初学者都是似懂非懂,要说简单,其实也确实简单,指针变量就是指向一个地址,也就是说,取指针变量的值是一个地址,而普通变量的值则是就是直接的值;
说复杂,也确实复杂,因为指针跟数组、函数、数据类型、多级指针,搭上勾,就会变得非常晦涩难懂,即使对于有经验的人,也容易出错。

建议学一下汇编语言和其它有指针功能的语言,这样可以增加对C语言指针的理解。
在汇编语言里,是没有指针这个概念的,但它却有类似指针这样的功能,那就是在申明变量时候,其后面的类型不是普通变量的数值,而是另外一个变量的偏移地址。这样,就能好理解C语言的指针了。
当指针有了地址后,还需要说明这个地址里类型是什么,在汇编语言里,就是用BYTE,DB,DW来表示,意思是每个数值占多少空间(字节),让CPU可以根据类型,跳到下一个元素的开始地址。

所以,指针这个东西,其实也就是转了点弯,不直接告诉东西在哪里,而是给你个地址号码,再去查下,就好像一座大楼里,很多房间,其中有一个房间放了黄金,但管理的人,不直接告诉你在哪个房间,只给你一个盒子,盒子放有这个存放黄金的房间地址,所以,要找到黄金,则需要先打开这个盒子。指针也就是类似这样的概念。

由于指针是直接操作地址,就变得非常不安全,比如越界非法访问,导致程序出错,在C语言程序里,一直是个很头痛的问题,需要程序员非常小心来处理这些问题。

先写到这里,有空再写下C语言跟其他语言指针的比较。

论坛徽章:
1
技术图书徽章
日期:2014-04-24 15:46:21
47 [报告]
发表于 2014-03-18 10:49 |只看该作者
记住一点就可以了,指针是解耦利器。

论坛徽章:
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
48 [报告]
发表于 2014-03-18 11:13 |只看该作者
to407 发表于 2014-03-17 16:04
回复 41# MMMIX


对照 C99 标准看了一下原书的内容,那个 NULL 的定义并没有问题:

1. 6.3.2.3 Pointers
3 An integer constant expression with the value 0, or such an expression cast to type
void *, is called a null pointer constant.66) If a null pointer constant is converted to a
pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal
to a pointer to any object or function.


2. 66)
The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant; see 7.19.


可见 NULL 需要被扩展为一个 null pointer constant,而 (void *)0 本身就是一个 null pointer constant.

论坛徽章:
0
49 [报告]
发表于 2014-03-18 11:41 |只看该作者
这个话题对于广大程序员来说可以好好发表一下自己的意见。

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
50 [报告]
发表于 2014-03-18 12:47 |只看该作者
MMMIX 发表于 2014-03-18 11:13
对照 C99 标准看了一下原书的内容,那个 NULL 的定义并没有问题:

1. 6.3.2.3 Pointers


问题就在这里呀

你引的第一段标准里面说

在pointer部分, value 0 或者(void *)0 是 "null pointer constant"
另外这个值 转成指针型,对应的指针就叫 “ null pointer”

这个定义是列举式的,没有问题啊。
但列举式就像我前面提到的,不是 vice versa的, 换句话说, "null pointer constant"具体是什么,没有讲清楚。

所以这一段话跟这个争议无关。


如上面提到过的,NULL 本身的意义,是基于实现的。

而你引的第二段,讲的  NULL is defined as a null pointer constant,这个也没错, 但 就不能说 #defince NULL (void *)0了啊。 因为 除了(void *)0以外的"null pointer constant" 还存在。

所以我说的只是 这本书原文不严谨, 毕竟都讲指针了,那就至少 讲明这个NULL实现 并不是惟一值 嘛,备注一下 也有实现成0的也行啊 。


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP