| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 718 人关注过本帖
标题:【我们来谈谈NULL】
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
某些平台上NULL不是0 但现在这样的平台几乎没有了。。
2014-03-18 08:36
一恒
Rank: 1
等 级:新手上路
帖 子:7
专家分:3
注 册:2014-3-18
收藏
得分:0 
NULL和指针的关系比较密切,声明一个指针后,若果不能马上赋予明确的地址值,
则需要先将其设为NULL,这样在后面的代码中要是忘了赋值,就不会因为野指针的存在而找不到错误原因,
结合好的编程习惯:在运用指针变量前加以判断
    if(p == NULL)
        printf("指针变量p未赋明确的地址值!");
    else
        process……
2014-03-18 16:24
klapset
Rank: 4
等 级:业余侠客
威 望:2
帖 子:71
专家分:234
注 册:2014-2-27
收藏
得分:0 
指向0地址的指针
2014-03-19 13:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
6.11 为什么有那么多关于空指针的疑惑?为什么这些问题如此经常地出现?

C 程序员传统上喜欢知道很多 (可能比他们需要知道的还要多) 关于机器实现的细节。 空指针在源码和大多数机器实现中都用零来表示的事实导致了很多无根据的猜测。 而预处理宏 (NULL) 的使用又似乎在暗示这个值可能在某个时刻或者在某种怪异的机 器上会改变。``if(p == 0)" 这种结构又很容易被误认为在比较之前把 p 转成了整 数类型, 而不是把 0 转成了指针类型。最后, 术语 ``空" 的几种用法 (如上文 问题 6.10 所列出的) 之间的区别又可能被忽视。

冲出这些迷惘的一个好办法是想象 C 使用一个关键字 (或许象 Pascal 那样, 用  ``nil") 作为空指针常数。编译器要么在源代码没有歧义的时候把 ``nil" 转成适 当类型的空指针, 或者有歧义的时候发出提示。现在事实上, C 语言的空指针常 数关键字不是 ``nil" 而是 ``0", 这在多数情况下都能正常工作, 除了一个未加修饰 的 ``0" 用在非指针上下文的时候, 编译器把它生成整数 0 而不是发出错误信息, 如果那个未加修饰的 0 是应该是空指针常数, 那么生成的程序不行。

授人以渔,不授人以鱼。
2014-03-19 13:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
NULL宏在頭文件中的定義是這樣的:
程序代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

在C++中,它是數値零,在C中,它強制指向一個指針型數據而不是數値。也就是說,這個宏應該用在指針數據上,特指不指向任何數據的指針。在擴展的C++編譯器中,推薦用內置nullptr數據類型替代NULL宏,亦即上文(標準制訂者關於《標準》的解釋)中所稱的'nil'符號。解釋者的意思,是勸告程序員,不要把NULL理解為必定是零,也不要理解為必定不是零,亦即不要去猜測它到底是什麽値——事實上這由編譯器根據環境選擇,是告訴編譯器把這個指針處理為“不指向任何地址的指針”,你不需要理會它的値到底是什麽,作爲關鍵字看待即可。

[ 本帖最后由 TonyDeng 于 2014-3-19 13:57 编辑 ]

授人以渔,不授人以鱼。
2014-03-19 13:45
祭柒未央
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-3-19
收藏
得分:0 
一.NULL字符
  在ASCII码的第一个字符是NULL,它的数值是0,占用1字节;C语言把它作为字符串的最后一个字符,以表示字符串到此结束."\0"
二.NULL指针
  在C语言的头文件stddef.h中,NULL的定义如下:
  #ifndef NULL
  #ifdef __cplusplus
  #define NULL 0
  #else
  #define NULL ((void *)0)
  #endif
  #endif
  #interface NULL 0
  可见,NULL指针是一个无类型指针,并且值为0。一个指针,拥有2个属性--地址值和指针类型。两者的作用是:1,地址值标识变量的首地址(32位系统下指针的地址值占4字节);2,指针类型告诉编译器,应该怎样进行接下来的数据访问(int型数组和float型数组是不同的;数组访问与结构体访问也是不同的;等等)。
2014-03-19 15:09
至死丶不渝
Rank: 2
等 级:论坛游民
帖 子:2
专家分:30
注 册:2014-3-19
收藏
得分:20 
目前好像还没有一个很具说服力的
还有平时我们用NULL的并没有在定义头文件之后再使用,所以在包含相应头文件的时候NULL可能要重新看待!
以下来自ISO/IEC 9899:201x
1.先看看void
The (nonexistent) value of avoid expression(an expression that has typevoid) shall not
be used in any way, and implicit or explicit conversions (except tovoid) shall not be
applied to such an expression.  If an expression of any other type is evaluated as a void
expression, its value or designator is discarded. (A void expression is evaluated for its
side effects.)
2.再看看pointers
An integer constant expression with the value 0, or such an expression cast to type
void *, is called a null pointer constant.
If a null pointer constant is converted to a
pointer type, the resulting pointer, called anull pointer, is guaranteed to compare unequal
to a pointer to any object or function.

如果哪天你失去了色彩,我愿守望着天空,寻找你的星座.....
2014-03-19 22:35
张昱雯
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2014-3-20
收藏
得分:0 
在C语言中,

NULL和0的值都是一样的,但是为了目的和用途及容易识别的原因,NULL用于指针和对象,0用于数值


对于字符串的结尾,使用'\0',它的值也是0,但是让人一看就知道这是字符串的结尾,不是指针,也不是普通的数值
2014-03-20 18:15
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
NULL 只是一个宏定义
在代码中都是提倡使用NULL来表示空指针的
为了增加代码的可移植性而定义的,有些情况下空并不代表为0,还有就是位数的问题了,0的表示也分32位和64位之分,使用宏就容易跨平台
这些只是我模糊有印象的,我好久没有接触这些了,忘了好多

人得一生得奋斗!
2014-03-20 22:50
快速回复:【我们来谈谈NULL】
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030641 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved