空指针,野指针,nil,Nil,NULL,NSNULL

1. 空指针(百度)

问题一: 什么是空指针常量?
1.一个表示0值的整数常量,叫做空指针常量;
2.至于系统选取哪种形式作为空指针常量使用,则是实现相关的。
3.一般的 C 系统选择 (void*)0 或者 0 的居多(也有个别的选择 0L);

解释: 0、0L 、3 - 3以及 (void)0 等都是空指针常量(注意 (char) 0 不叫空指针常量,只是一个空指针值)。

问题二: 什么是空指针(null pointer)?
如果一个空指针常量 赋给了一个有类型的指针变量,那么这个指针就叫空指针。
1.空指针是一个特殊的指针,也是一个对任何类型都合法的指针值。
指针具有空指针值,表示当时他处于空置的状态,并且由系统保证空指针不指向任何实际的对象或者函数,   
 反过来说,任何对象或者函数的地址都不可能是空指针。
2.空指针用0表示,C语言保证这个值不会是任何对象的地址,给指针赋0则使他不在指向任何有意义的东西。
3.为了提高程序的可读性,标准库定义了一个和0等价的符号常量NULL,p=0/p=NULL,将p置为空指针值。

解释:如果 p 是一个指针变量,

若进行: p = 0;、p = 0L;、p = '\0';、p = 3 - 3;、p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;)

问题三:空指针(null pointer)指向了内存的什么地方即空指针的内部实现?

标准并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个具体的地址值(0x0 地址还是某一特定地址)表示

空指针取决于系统的实现。

在实际编程中不需要了解在我们的系统上空指针到底是一个 zero null pointer 还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。

不要把空指针的内部表示等同于整数 0 的对象表示——如上所述,有时它们是不同的。
问题四: 什么是 NULL?
 NULL 是一个标准规定的宏定义,用来表示空指针常量。
因此,除了上面的各种赋值方式之外,还可以用 p = NULL; 来使 p 成为一个空指针。

有些系统中这样来宏定义的

    #define NULL 0

char *p = NULL;

问题5: 在实际的操作中 如何判断某个指针是不是空指针?
可以通过与空指针常量或者其它的空指针的比较来实现
(注意与空指针的内部表示无关)。

指针变量p 是空指针的判断: (假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针)

if ( p == 0 )

if ( p == 3 - 3 )

if ( p == NULL ) /* 使用 NULL 必须包含相应的标准库的头文件 */

2. 野指针

question?

操作不当造成的野指针,甚至会引起系统死机等比较严重的后果。 如果程序定义了一个指针,就必须要立即让它指向一个我们设定的空间或者把它设为NULL;

why?

如果没有这么做,那么这个指针里的内容是不可预知的,即不知道它指向内存中的哪个空间(即野指针),它有可能指向的是一个空白的内存区域,可能指向的是已经受保护的区域,甚至可能指向系统的关键内存,如果是那样就糟了,也许我们后面不小心对指针进行操作就有可能让系统出现紊乱,死机了。

原理?

NULL,如果是建立一个与指针相同类型的空间,实际上是在内存中的空白区域中开辟了这么一个受保护的内存空间,然后用指针来指向它,那么指针里的地址就是这个受保护空间的地址了,而不是不可预知的啦,然后我们就可以通过指针对这个空间进行相应的操作了;
如果我们把指针设为NULL,我们在头文件定义中的 #define NULL 0 可以知道,其实NULL就是表示0,那么我们让指针=NULL,实际上就是让指针=0,如此,指针里的地址(机器数)就被初始化为0了,而内存中地址为0 的内存空间……不用多说也能想象吧,这个地址是特定的,那么也就不是不可预知的在内存中乱指一气的野指针了。

注意?
  • free和delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。
  • 用free或delete释放了内存之后,就应立即将指针设置为NULL,防止产生“野指针”。
  • 内存被释放了,并不表示指针会消亡或者成了NULL指针。(而且,指针消亡了,也并不表示它所指的内存会被自动释放。)
1、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的默认值是随机的,它会乱指一气。 

2、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。 

3、指针操作超越了变量的作用范围。

3. nil,Nil,NSNULL,NULL

屏幕快照 2018-01-04 14.52.41.png
nil,Nil,NULL只是区分不同类型的空指针
NSNULL代表是一个对象,这个对象代表0值

NSURL *url = nil;//对象指针为空
Class  class = Nil;//类指针为空
int *pointerInt = NULL;//基本数据类型为空

4.OC中返回空数据的处理

  • OC中nil是一个指向不存在的对象指针,
  • OC中的对象定义默认赋值为nil,而数组和字典里是不可以有nil的,但可以为[NSNull null];
  • OC在框架层面,Foundation定义了NSNull,即一个类方法+null,它返回一个单独的NSNull对象。
  • NSNull与nil以及NULL不同,因为它是一个实际的对象,而不是一个零值。
  • 当向nil发送消息时,返回NO,不会有异常,程序将继续执行下去;而向NSNull的对象发送消息时会收到异常。

5.OC中实际应用

// 判断字典对象的元素是否为空  
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:  
    @"iPhone", @"First", @"iPad", @"Second", nil];  
NSString *value = [dictionary objectForKey:@"First"];  
if ((NSNull *)value == [NSNull null]) {  
}  

// 判断数组元素是否为空  
NSString *element = [array objectAtIndex:2];  
if ((NSNull *)element == [NSNull null]) {  
}  
其他问题1: 可以定义自己的 NULL 的实现吗?

解释:NULL 是标准库中的一个符合上述条件的 reserved identifier (保留标识符)。所以,如果包含了相应的标准头文件而引入了 NULL 的话,则再在程序中重新定义 NULL 为不同的内容是非法的,其行为是未定义的

其他问题2:malloc 函数在分配内存失败时返回 0 还是 NULL?

解释: malloc 函数是标准 C 规定的库函数。在标准中明确规定了在其内存分配失败时返回的是一个 “null pointer”(空指针):

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容