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>
答案 0 :(得分:6)
指针不包含他们指向的数据。
指针只是指向他们指向的数据。
sizeof( double* )
是用于描述double
所在位置的数据大小。就像一张带有房屋地址的纸张,如果房子更大或更小,它不会改变尺寸,指针的大小不是指向的数据大小的函数。
这不常见了(除了成员函数指针,但这些指针有多常见?)
答案 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答案很多?是的。为什么?因为我很无聊。)