指针的大小是多少?

指针的大小是否与它所指向的类型的大小相同,还是指针总是有一个固定的大小?比如说..。

int x = 10;
int * xPtr = &x;
char y = 'a';
char * yPtr = &y;


std::cout << sizeof(x) << "\n";
std::cout << sizeof(xPtr) << "\n";
std::cout << sizeof(y) << "\n";
std::cout << sizeof(yPtr) << "\n";

这样做的结果会是什么?sizeof(xPtr)返回4,sizeof(yPtr)返回1,还是这两个指针实际上返回相同的大小?

我问这个问题的原因是因为指针存储的是内存地址,而不是它们各自存储的地址的值。

185821 次浏览

指针通常有一个固定的大小,例如。在32位可执行文件上,它们通常是32位的。也有一些例外,比如在旧的16位窗口中,你必须区分32位指针和16位指针... ... 在现代桌面操作系统中,假设它们在给定的可执行文件中是统一的通常是相当安全的。

编辑: 即便如此,我也要强烈警告不要做出这样的假设 在你的代码里。如果你要写的东西绝对必须有一个特定大小的指针,你最好检查一下!

函数指针则是另一回事——更多信息请参见 Jens 的回答

在32位机器上,指针的大小是32位(4字节) ,而在64位机器上是8字节。不管它们所指向的数据类型是什么,它们都有固定的大小。

指针的大小是系统保存唯一内存地址所需的大小(因为指针只保存它指向的地址)

根据编译器的不同,函数指针可以有 非常不同大小,在 x86计算机上从4字节到20字节不等。所以答案是 没有的大小可以有所不同。

另一个例子: 以 8051程序为例。它有三个内存范围,因此有三个不同的指针大小,从8位,16位,24位,取决于目标的位置,即使目标的大小始终是相同的(例如,Char)。

回答你的另一个问题。指针的大小和它所指向的内容的大小没有关系。一个很好的类比是把它们看作是邮政地址。房子地址的大小与房子的大小没有关系。

在相同的体系结构上,指针的大小并不总是相同的。

您可以阅读更多关于“近”、“远”和“巨大”指针的概念,就像指针大小不同的例子一样..。

Http://en.wikipedia.org/wiki/intel_memory_model#pointer_sizes

在单词寻址机器(例如,Cray PVP 系统)上,它们可能是不同的。

今天的大多数计算机都是字节寻址的机器,其中每个地址都指向一个内存字节。在这里,所有的数据指针通常都是相同的大小,即机器地址的大小。

在可字寻址的机器上,每个机器地址引用一个大于一个字节的字。在这些情况下,指向一个字节内存的(char *)或(void *)指针必须包含一个单词地址和所寻址单词内的一个字节偏移量。

Http://docs.cray.com/books/004-2179-001/html-004-2179-001/rvc5mrwh.html

最近遇到一个情况,这是不正确的,TI C28x 板可以有一个大小为指针 = = 1,因为这些板的一个字节是16位,指针大小是16位。为了使事情更加混乱,他们也有远的指针是 22位。我不确定远指针的大小。

一般来说,DSP 板可以有奇怪的整数大小。

所以如果你在奇怪的地方寻找,指针的大小在2020年仍然是奇怪的