数据存储在内存中。该内存有一个地址。指针保存数据开始。的内存地址。
具体地说,指针通常保存类型所驻留的数据的“第一个字节”的地址(注意,从技术上讲,第一个字节可能包含数据的最后一位,具体取决于endianness。
即,如果long double是128位(16字节),则指针值将指向第一个字节,而指针类型将指示应读取的字节数。
如果您将示例中的long double指针“广播”到int *(int指针),则仅会读取sizeof(int)字节-但是值(第一个字节的地址)将保留一样。
因此,指针值忽略了数据的大小,指针仅需要足够大才能包含第一个字节的地址。因此,指针通常具有与computer's "address space"相同的长度。
它非常类似于图书馆中的目录卡。就像库中的“书本地址”取决于库的大小一样,指针值(内存地址)也取决于计算机的“地址空间”的大小,不是类型的大小。] >
在大多数32位和64位CPU上,地址空间限制为32位或64位。但是,某些系统具有用于特殊指针(例如函数指针)的特殊地址空间...这几乎已过时。当CPUS小于32位并且“地址空间”受到限制时,它被更多地使用。
请注意,地址空间(指针)中的值可以指向硬件上的任何位置(通常是内存中的一个字节,但有时是寄存器或一块硬件)...这就是为什么操作系统(内核)可以利用一些硬件支持,通常会为每个进程公开一个“虚拟”地址空间,从而保护硬件和其他处理过程免受异常进程的影响。
P.S。
我喜欢@linuxfansaysReinstateMonica给出的答案。但是,我发现我想澄清该答案中的一些信息。您应该真正阅读它。该答案主要是对其答案的澄清。