免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4048 | 回复: 29

null 指针的使用 [复制链接]

论坛徽章:
0
发表于 2004-09-18 23:54 |显示全部楼层

null 指针的使用

不好意思,我语文总是在及格线挣扎,呵呵

其实指针作为一个内存单元是没有什么区别的,都是索引一段内存区域的首地址。

对编译器来说,不同的是各种类型指针的语义,一般理解是可以索引的内存区域的大小,比如char * 可以索引1个字节,int *可以索引4个字节(也有的系统2个字节)。

一个需要注意指针类型的地方是函数调用中,传递null作为参数。

比如 int foo(char * a, int *b) //声明

在c语言里面宏null == 0     //我记错了,记成c++的了,后面有道歉。

如果调用的时候使用foo("a",null);

因此宏替换为foo("a",0),一些编译器在函数调用的时候做类型检查,于是报告错误,类型不匹配。当遇到这样的编译器只能使用foo("a",(int *)0)。

当然不是所有编译器都出现警告或错误,许多现在流行的编译器会捕捉这个常见的用法,将0转换为(int *)0,(说明编译器相当的make human happy)

不知道还有没有需要注意的地方,请下面的高人补充。

论坛徽章:
0
发表于 2004-09-19 01:18 |显示全部楼层

null 指针的使用

这个贴子是我从另一个贴子中分离出来的,因为原来贴子所讨论的问题与下面的论战无关。为避免影响原来贴子的讨论,我把它割了出来,独成一贴。

=================================================

各位网友,关于 null 指针的概念,请参考这个贴子:

http://bbs.chinaunix.net/forum/viewtopic.php?t=404711

ljttlf   在上面对零指针的解释是错误的(其它的我没看),大家小心。为避免错误概念传播,我已经把上面的那个贴子加精,供大家参考。

论坛徽章:
0
发表于 2004-09-19 01:22 |显示全部楼层

null 指针的使用

to >; ljttlf  

>;>;一个需要注意指针类型的地方是函数调用中,传递null作为参数。

>;>;比如 int foo(char * a, int *b) //声明

>;>;在c语言里面宏null == 0

没有  null , 只有  NULL

>;>;如果调用的时候使用foo("a",null);

>;>;因此宏替换为foo("a",0),一些编译器在函数调用的时候做类型检查,于是报告错误,类型不匹配。当遇到这样的编译器只能使用foo("a",(int *)0)。

如果使用 foo("a",null); 那自然是错的。如果 foo ("a", NULL) 则不会有错,也不会有警告。

>;>;当然不是所有编译器都出现警告或错误,许多现在流行的编译器会捕捉这个常见的用法,将0转换为(int *)0,(说明编译器相当的make human happy)

如果 foo("a", 0),在绝大多数编译器上,都没有警告。
c 语言规定,在指针上下文,常数 0 被自动转化为 null 指针常数。所以  foo("a", 0) 是完全合法的,符合标准的,没一点点错误。如果没有对 foo 进行声明,另当别论,如果是可变参数的函数,也另当别论。

论坛徽章:
0
发表于 2004-09-19 01:25 |显示全部楼层

null 指针的使用

为什么错?
能告诉我原因吗

论坛徽章:
0
发表于 2004-09-19 01:34 |显示全部楼层

null 指针的使用

关于我说null定义不严谨的帖子,你也没有说服我,我也没有拿出证据说服你,

我说null的定义不严谨而不是bug,而你们老是说我的意思是null的定义是个bug。

而这篇帖子,据你说你没有看,ok ,那你如何可以定性我说的是错误的??希望版主严谨对待每一个看法。

论坛徽章:
0
发表于 2004-09-19 01:50 |显示全部楼层

null 指针的使用

搞得我跟误人子弟,不学无术是的!

论坛徽章:
0
发表于 2004-09-19 01:59 |显示全部楼层

null 指针的使用

>;>; 因此宏替换为foo("a",0)

即使你说  NULL 的定义不严谨,但在绝大多数编译器上, foo ("a", NULL) 会被展开为 foo ("a", (void *)0) 而不是 foo("a",0)。这是我要强调的一个错误 。

我没说你不学无术,事实上,如果一个不学无术的人发这样的帖子,我是不会理的。因为没人会听。但你不同,你最近发的帖子讨论的问题都有一定层次,我想会有人听你的。作为斑竹,我要对这里负责,不得不挺身而出。

如果我的观点错了,我回道歉的。

论坛徽章:
0
发表于 2004-09-19 02:02 |显示全部楼层

null 指针的使用

However, an argument being passed to a function is not necessarily recognizable as a pointer context, and the compiler may not be able to tell that an unadorned 0 ``means'' a null pointer. To generate a null pointer in a function call context, an explicit cast may be required, to force the 0 to be recognized as a pointer. For example, the Unix system call execl takes a variable-length, null-pointer-terminated list of character pointer arguments, and is correctly called like this:

        execl("/bin/sh", "sh", "-c", "date", (char *)0);
If the (char *) cast on the last argument were omitted, the compiler would not know to pass a null pointer, and would pass an integer 0 instead. (Note that many Unix manuals get this example wrong .)

论坛徽章:
0
发表于 2004-09-19 02:04 |显示全部楼层

null 指针的使用

1、就你给出的例子不是这种情况
2、我已经添上了一句,参数个数不定另当别论
3、NULL 本身是 (void *)0,如果用 NULL,编译器就知道它是个指针。

睡觉去了。

论坛徽章:
0
发表于 2004-09-19 02:08 |显示全部楼层

null 指针的使用

这是摘自
http://www.eskimo.com/~scs/C-faq/top.html
的一句话,这里是 comp.lang.c Frequently Asked Questions。
里面告诉我们,对于指针环境,0,和(void*)0是一个概念。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP