C/C++中,NULL和null的区别是什么?
C语言和C++对大小写是敏感的,也就知是说null和NULL是区别对待的。NULL(如已宏定义)代表空地址,null(如没宏定义)只是一个符号。
1、其实null和NULL都是字符串,具体看它们宏定义被定义成为什么值。
2、在VS中NULL被定义为0,因为习惯上把宏定义的所有字符都大写,当把NULL它赋值给指针时意思为空,当然你也可以把null定义为0了,都一样。你把0直接赋值给指针也行,只要指针指向0就为空。
3、对于空(null)指针的概念,在 C 标准中明确地定义:值为 0 的整型常量表达式,或强制(转换)为“void*”类型的此类表达式,称为空指针常量。
4、当将一个空指针常量赋予一个指针或与指针作比较时,将把该常量转换为指向该类型的指针,这样的指针称为空指针。空指针在与指向任何对象或函数的指针作比较时保证不会相等。
扩展资料
在C中,任何类型的两个空指针都保证比较相等。预处理器宏NULL被定义为实现定义的空指针常量,它在C99中可以可移植地表示为0隐式或显式转换为类型的整数值void*(指向void的指针)。
C标准没有说空指针与指向内存地址0 的指针相同,尽管在实践中可能就是这种情况。解引用空指针是C中的未定义行为,并且允许符合要求的实现假定任何被解除引用的指针不为空。
参考资料
VS中NULL被定义为0,因为习惯上把宏定义的所有字符都大写,当把NULL它赋值给指针时意思为空,当然你也可以把null定义为0了,都一样。
它们都没定义时都只能叫符号了,定义后就有另外的意思了,你把0直接赋值给指针也行,只要指针指向0就为空。
其实NULL在有些编译器中是赋为0了,这时你不能再去#define定义它了,否则就重定义了!
#define NULL ((void*)0) /*C中的“标准”写法,NULL被替换为一个void*类型的指针右值,值等于0;由于是void*类型,可以隐式转化为其它类型的指针。
#define NULL 0 //C++,相对C简化定义的原因是C++中void*无法自由隐式转换为其它类型的指针,而字面量0可以隐式转换为指针类型;尽管它实际上可以被作为整数0使用而不引起编译问题,但要注意,从设计目的上而言,NULL应当总是只作为空指针使用。
char c = NULL相当于char c = 0,也就是把c初始化为0。0在这里并不是空指针的意思,而是隐式转换成的字符'/0'——值为0的char字符。在C/C++的一般实现中,这样的行为(值为0的数值类型,无论是void*或int,转换为char的值还是0)是明确的,但这种用法并不恰当。一如LS的错误,ASCII及兼容字符集中数值0对应的字符为null character(null terminator),应该用NUL(没有在标准库中定义,语言中char类型用'/0',wchar_t类型用L'/0')而不是NULL表示。NUL的一个重要应用是作为C风格字符串的结尾标志字符。