null和空字符有区别吗?

2024-11-08 06:17:06
有3个网友回答
网友(1):

null和空字符的区别:

1、NULL:代表声明了一个空对象,不是一个字符串,可以赋给任何对象。 

空字符:代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。

2、String s=null; 只是定义了一个句柄,即你有了个引用,但是这个引用未指向任何内存空间。

String s=”“; 这个引用已经指向了一块是空字符串的内存空间,是一个实际的东东了,所以可以对它操作。

String s=”a”和String s=new String(“a”);是有本质上的区别的 :

(1) 前者是在字符串池里写入一个字符’a’,然后用s指向它; 后者是在堆上创建一个内容为”a”的字符串对象。

(2) String str=”aaa”; //于栈上分配内存 ;String str=new String(“aaa”); //于堆上分配内存

请添加详细解释

网友(2):

主要区别是null表示引用对象未知不确定,主要用于对象判断;空表示值未知不确定,主要用于数据值的判断。string a =null 表示创建一个字符串引用变量a存在栈内存上,不指向任何内存地址,即没有引用任何对象;string a="" 则表示 创建一个字符串引用变量a存在栈内存上,并且指向了字符串常量内存池的一块空间(里面是空的没有值)。

网友(3):

学习C++中最重要的是关注类型,类型不同数据宽度即编码就不同。表面上看null的定义和空字符等效都是0值,但是用途以及类型完全不同,为了代码可读性以及避免同一个程序在不同编译器上出现不同的结果(不同编译器存在的隐含操作不同)造成跨编译器无法编译的问题,编写代码时最好不要依赖编译器的隐式转换。

null的定义为(void *)0,也就是将0值定义为无类型的指针值,一个地址常数0,一般地址的数据宽度都是32位的,代表指针为空指针,无效指针,即没有指向任何地址,而地址是无符号整数。

'\0'空字符则是char类型的0值,char在C++中是单字节宽度的有符号整数(C#中是32位Unicode字符),所以null和空字符的区别是类型,而类型决定了数据宽度以及编码,虽然说0值在任何场合都是通用的,但是编译器在最终编译时需要确定数据宽度以及编码方式,指针是32位无符号整数(4字节,即0x00000000),而char是8位有符号整数(1字节,0x00)。

虽然你在C++中也可以像char c=null这样写,因为编译器会隐式转换,将(void *)转换为 char,也即将32位的0值截断,丢弃高位3字节,用低位的单字节赋值给char变量(否则就会覆盖冲掉到其他地址中的内容引起程序错误),但是为了可读性以及移植性,指针只用null,字符只用'\0',这样比较明确。