2013-03-21 77 views
2
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的整数?指针的大小

+0

在64位上尝试它,你会发现它是不同的。 :) – Mysticial 2013-03-21 02:05:43

+1

这是一个奇怪的问题;你知道指针是什么吗?为什么你会期望它有不同的大小? – tenfour 2013-03-21 02:07:21

+0

C++社区只是一个简单的问题,但我在短时间内收到很多回复。高兴!谢谢。 – 2013-03-21 02:13:06

回答

1

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

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

6

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

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

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

嗯,通常。你可以想象国际地址更长,并且需要更多的纸张。同样,您可以想象公寓内的地址与其他地址相比需要额外的“单元号”,或者甚至“公寓内”地址只包含包含“单元号”,因此更短。该标准允许各种指针的大小不同,而某些体系结构(最着名的8086)具有近指针和远指针(分别为16位和32位)的概念。

这是不常见了(也许除了成员函数指针的,但如何常见的是那些?)

+0

爱你提到的寻址示例! – Ajay 2013-03-23 07:27:29

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(Binary representation:011
  • 0x4(二进制表示法:100
  • 0x5(二进制表示法:101
  • 0x6(二进制表示法:110
  • 0x7(二进制表示法:111

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

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

(矫枉过正的回答多少?是的。为什么呢?因为我很无聊。)

+0

并非总是如此。但大部分时间都是如此。当然不是标准要求的。例如,它可能包含某些体系结构上的段偏移量,该偏移量可能小于物理机器的地址空间。 – 2013-03-21 02:19:24

+0

当然,但我不认为有人会想要处理这种特殊情况:p(好东西没有/理智/程序员必须) – 2013-03-21 02:21:29

+0

没错,没有人想要处理特殊情况。但在某些情况下,需要特殊情况才能正确理解。 C和C++在指针上放置了要求“类似地址”的指针 - 但是并没有强制指针存储的数据与底层机器的物理内存寻址模型之间的任何关系。 – 2013-03-21 02:23:13

2

指针实际上是包含地址的变量。在32位机器上,地址总是32位,所以它是4个字节。用于16位或64位机器的相同逻辑。

只是看着到C99标准,它说:

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

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

+0

它可能不包含地址。例如,在某些体系结构中,它将包含段偏移量。 – 2013-03-21 02:20:12

+0

好吧,谢谢你指出,你提到远点? – 2013-03-21 02:30:00

+1

在某些体系结构中,可能会有近/远指针的概念,是的。但这不是标准讨论的内容。该标准对指针的要求是强制它们以类似于内存地址的方式操作。但决不要求存储在指针中的值与目标机器上的物理存储位置之间存在任何关系。 – 2013-03-21 02:34:08