问题:
int
float
char
str
这些var类型都有一个为它们分配的标准化字节分配。但是对于指针,我从来没有学过这个:
这些"address"存储变量,其内容似乎只是一系列字母数字字符。
c++代码:
int *ptr1;
char *ptr2;
void *ptr3;
那么上面列出的指针的标准内存分配是多少呢?一般来说呢?指针的大小为sizeof(ptr1)
字节,这是所有标准指定的。理论上,不同的对象指针可以有不同的大小,不同的函数指针也可以有不同的大小。
归根结底,我们通常指的是32位CPU的数据大小(它在一条指令中可以处理的最大块)并不一定对应于地址总线宽度/可寻址内存空间。后者决定指针的大小。
在实践中(简化):
-
8位和16位微控制器系统,以及旧的16位PC可能具有不同的指针大小,通常在8到32位之间,其中16位最常见。它们通常使用非标准关键字,如指针限定符
near
或far
来表示这一点。一些ISA可能有一个"零页",这意味着指向前256个地址的8位指针,在那里它们可以更快地执行代码/访问数据(通常这将在冯·诺伊曼mcu上)。类似地,它们可以具有超出正常65536字节的扩展内存,这可能会降低执行/数据访问速度。24位指针并不少见。
-
32位系统通常有32位指针。
-
64位系统通常有64位指针。
如果出于某种原因需要获取绝对地址,那么uintptr_t
是可移植整数类型,它应该足够大,可以容纳给定系统上的任何指针地址。