哪个表达式是使用 sizeof() 始终具有相同内存大小的双指针变量?

Which expression is the double pointer variable that always has the same memory size using sizeof()?

在研究C中的指针时,遇到了一段代码。

#include <stdio.h>
int main(void){
    double d=5.3;
    double *dp;
    dp=&d;

    printf("%d\n", sizeof(*dp)); 
    printf("%d\n", sizeof(dp)); 
    return 0;
}

使用 64 位系统的结果将是 8 8

我之所以想到这个原因是因为

  1. printf("%d\n", sizeof(*dp));: *dp 指向 value 这是一个 double 类型使其打印 8(byte)

  2. printf("%d\n", sizeof(dp)); dp 是一个指针变量,在 64 位系统中是 8byte,在 64 位系统中是 4byte 32位系统.

我想知道我理解的是否正确,或者我是否将1和2的原因调换了。

你已经差不多明白了:

sizeof  dp == sizeof (double *) == 8 (on your system)
sizeof *dp == sizeof (double)   == 8 (on your system)

您的特定系统 上,doubledouble * 占用相同数量的space。然而,这不一定是真的。

Floating-point 类型必须能够以 最小精度 表示 最小值范围 - 对于 double,它必须能够表示 至少 范围内的值 1 x 10<sup>-37</sup>1 x 10<sup>37</sup> 并提供 至少 10 位小数精度。大多数现代系统使用 IEEE-754 double-precision 格式,它满足这些要求并且恰好占用 64 位。

指针类型与表示特定类型的对象或函数的地址所需的一样大。这可能会受到 CPU 上地址线数量的影响,无论您使用的是平面还是分段内存模型,您的平台是字节还是 word-addressed,等等。唯一的要求是如下:

  • char *void * 具有相同的大小和对齐方式;
  • 指向限定类型​​的指针与指向其非限定等价物(例如,sizeof (const int *) == sizeof (int *))的指针具有相同的大小和对齐方式;
  • 所有指向 struct 类型的指针都具有相同的大小和对齐方式;
  • 所有指向 union 类型的指针都具有相同的大小和对齐方式;

除此之外,它是敞开的。可以有 sizeof (char *) != sizeof (int *)sizeof (int *) != sizeof (int (*)[N])

的系统

还有哈佛架构,其中代码和数据保存在物理上独立的内存中,地址总线大小不同,因此对象指针和函数指针的大小可能不同。

说了这么多,您很可能不会从事任何异国情调的工作。在大多数现代桌面系统上,所有指针类型都具有相同的大小和表示形式。请注意,并非所有地方都能保证这一点。

备注

sizeof 运算符的结果类型为 size_t,可能(通常)大于 int,因此您应该使用 %zu 转换说明符打印它而不是 %d:

printf( "sizeof *dp == %zu, sizeof (double) == %zu\n", sizeof *dp, sizeof (double) );

请记住 sizeof 是一个 运算符 ,而不是一个函数 - 如果它是像 [=24= 这样的类型名称,您只需要在操作数周围使用括号] 或 double.