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 的大小?

4

4 回答 4

6

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

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

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

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

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

于 2013-03-21T02:08:18.657 回答
2

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

刚刚查看了 C99 标准,它说:

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

好吧,因此我认为了解指针大小的最安全方法是sizeof().

于 2013-03-21T02:09:10.813 回答
1

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

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

于 2013-03-21T02:05:56.510 回答
1

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

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

如果应用程序是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因此,在这种情况下,需要有一个指向内存地址的指针。

替换332,这将适用于您在这里所做的事情。

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

于 2013-03-21T02:08:36.103 回答