据我所知C++指向0地址,那么0地址具体的内容又是什么呢?
另外附带问下,我们所说的32位和64位具体指的是什么?是寄存器的位数吗?
null指针为null的时候,其值是0。存储的是0,而不是真实的地址。如果此时你强行用
int * p = NULL;
*p = 123;
那么会收到一个地址无法访问的异常。
理论上,我们可以让0地址也存储数据,但是为了避免大部分的指针错误,我们一般将0~某个值的低地址设置为不可以访问的。
所以这些地址是无效的,没有内容。
好比:
如果你快递单在地址里填上“地址不详”,那么这个“地址不详”到底是哪里呢,结论是哪里也不是。
我们所说的32位和64位具体指的是什么
主要说的是cpu的直接寻址空间,32bit处理器是32bit(2^32=4GB),64bit就是2^64,因为寻址空间扩大了,所以相关的寄存器也扩大了。
但是要知道,32bit处理器的寄存器也可以很大。在Pentium时代(1997年),浮点处理器使用的寄存器(或者说MMX寄存器,其实是一回事)就有80bit了。但是显然Pentium是32bit的处理器。
0地址就是内存地址的起始位置,当然,这个地址一般是系统boot启动的地址,这个地址是受保护的,不允许应该程序访问的,如果不小心访问到这个
地址,系统就会抛出一个异常,32位和64位就是系统寻址时内存地址的位数,这个也是等于寻址寄存器的位数,比如32位地址表示例如:0x12345678,
如果是64位,那么地址就是0x0000000012345678,主要还是内存地址占用位数不同。
有两个常见的谬误,我解释下,你在c++也好,java也好,使用的地址,是逻辑地址,而不是内存的物理地址。
换一句话说,两个程序,都有一个叫1234的地址,它们其实是对应物理内存上两个完全不同的地方。
另一个误解是,内存地址空间和内存是不同的。因为一些外设、rom等等,也会使用内存地址,但是它们不是内存。
比如说,1234这个地址,可能对应的是计算机rom存储器(也就是bios系统)的一个地址,那么它显然就是只读的,而且显然不是内存。
类似地,显卡、dma方式存取的硬盘,等等也有各自的地址,这些地址显然也不是内存。
空指针指向逻辑0地址。访问该地址引发异常。
32/64位为CUP的寻址空间。
记的有一个头文件里 ,有这样一行:
#define null 0
也就是说 null , 就是0