精选
null和空字符有区别吗?
答案:6 悬赏:50 手机版
解决时间 2021-03-23 05:30
- 提问者网友:沦陷
- 2021-03-22 21:10
最佳答案
- 五星知识达人网友:拜訪者
- 2021-03-22 22:34
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”); //于堆上分配内存
请添加详细解释
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”); //于堆上分配内存
请添加详细解释
全部回答
- 1楼网友:十鸦
- 2021-03-23 04:26
有本质的区别哦
- 2楼网友:人類模型
- 2021-03-23 03:09
如:字符'0', '1', '2'……换成十进制数是48, 49, 50,这就是' ' 表示的字符和没有的区别哦
而字符串就是由字符组成,但有一个区别:
字符串“0123”,它可分割为'0' '1' '2' '3' '\0' <-----多了一个尾巴'\0'------对应的十进制值0(和'0'要区别开
而null的值就是'\0',即十进制的0,而字符'0'的十进制值是48(要分别开来哦)
--更深一层的就是null和'\0'(即0)只是值相同,意义上是不同的哦(这不懂也没事,有汇编知识可看下)
c在编译的时候,数据段和堆栈段会被生成一个dgroup的段组(即在内存中是相连的,并且是共用同一个段地址),而这dgroup中有一段就是null(0,表示是dgroup的开始那一小段,后面才是数据段这些)段了,它由编译器生成的,记录了编译器的相息。所以有相关的保护,不允许对它的内容修改<----这就是为何
- 3楼网友:鸽屿
- 2021-03-23 02:15
空字符串不是null。千万别这么想
- 4楼网友:刀戟声无边
- 2021-03-23 01:14
NULL说明:
1、等价于没有任何值、是未知数。
2、NULL与0、空字符串、空格都不同,NULL没有分配存储空间。
3、对空值做加、减、乘、除等运算操作,结果仍为空。
4、NULL的处理使用NVL函数。
5、比较时使用关键字用“is null”和“is not null”。
6、空值不能被索引,所以查询时有些符合条件的数据可能查不出来,count(*)中,用nvl(列名,0)处理后再查。
7、排序时比其他数据都大(索引默认是降序排列,小→大),所以NULL值总是排在最后。
可以简单理解为空字符串''就是null,
比如:
因为''就是null那么select 1 from dual where null=''''; 这条语句就被解析成
select 1 from dual where null=null;当然就没有记录了。其他的雷同
所以 select 1 from dual where '' Is Null;结果自然是有一条记录了
- 5楼网友:行路难
- 2021-03-22 23:48
学习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',这样比较明确。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯