指针的大小

时间:2013-03-21 02:04:37

标签: c++ sizeof

int i=0;
int *p = &i;
std::cout<<sizeof(i)<<" vs "<<sizeof(p)<<"\n";

char c='0';
char*pc = &c;
std::cout<<sizeof(c)<<" vs "<<sizeof(pc)<<"\n";

double d=0.123456789;
double *pd = &d;
std::cout<<sizeof(d)<<" vs "<<sizeof(pd)<<"\n";

为什么指针的大小总是等于4的整数<?p>

4 个答案:

答案 0 :(得分:6)

指针不包含他们指向的数据。

指针只是指向他们指向的数据。

sizeof( double* )是用于描述double所在位置的数据大小。就像一张带有房屋地址的纸张,如果房子更大或更小,它不会改变尺寸,指针的大小不是指向的数据大小的函数。

嗯,通常。你可以想象国际地址更长,需要更多纸张。同样地,您可以想象公寓楼内的地址需要额外的“单位数”线与其他地址相比,甚至是“公寓”地址包含“单位数”,因此短。该标准允许各种类型的指针大小不同,一些架构(8086最着名)具有近端和远端指针的概念(分别为16位和32位)。

这不常见了(除了成员函数指针,但这些指针有多常见?)

答案 1 :(得分:2)

指针实际上是一个包含地址的变量。在32位机器上,地址始终为32位,因此它是4个字节。 16位或64位计算机的逻辑相同。

刚看了C99标准,它说:

  

指针的大小不一定与任何大小相同   整数类型。实现可能支持多个大小   指针。

嗯,因此我认为知道指针大小最安全的方法是sizeof()

答案 2 :(得分:1)

因为这是指针占用多少内存:4个字节。

如果这是一个64位应用程序,它将返回8.

答案 3 :(得分:1)

指针的大小取决于您正在编译的应用程序类型。

指针类似于32位应用程序中的32-bit unsigned int,因为它存储了一个内存位置。

如果应用程序是N-bit应用程序,则任何指针的大小都将为N bits长,因为它需要足够大才能存储内存位置。

任何可运行N-bit个应用程序的N-bit计算机的RAM限制为2^N bytes。这使得最大内存位置id等于2^N - 1(因为0x00000000是有效的内存地址)。

2^N - 1要求N bits以二进制表示,而我的朋友就是为什么指针在32位应用程序中的大小为4个字节。

以简单的3-bit应用程序为例:(我宁愿不处理大数字)

我们假设它正在3-bit机器上运行。由于2^3 - 1是可以用3 bits二进制表示的最大数字,因此系统可以处理的最大内存为2^3个字节。 (这些是无符号的。不存在负内存地址)

可能的内存地址为:

  • 0x0(二进制表示:000
  • 0x1(二进制表示:001
  • 0x2(二进制表示:010
  • 0x3(二进制表示:011
  • 0x4(二进制表示:100
  • 0x5(二进制表示:101
  • 0x6(二进制表示:110
  • 0x7(二进制表示:111

因此,在这种情况下,指向内存地址的指针需要3 bits

3替换为32,这将适用于您在此处所做的事情。

(Overkill答案很多?是的。为什么?因为我很无聊。)