首页 > 解决方案 > 哪个表达式是使用 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指向双精度类型的,使其打印8(字节)

  2. printf("%d\n", sizeof(dp)); : thedp是一个指针变量,使其8在 64 位系统4中为字节,在 32 位系统中为字节。

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

标签: cpointersdoublesizeof

解决方案


你已经明白了:

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

您的特定系统上,两者都double占用double *相同数量的空间。但是,这不一定是真的。

浮点类型必须能够以最小精度表示最小范围的值- 对于,它必须能够表示至少范围内的值并提供至少10 位精度的十进制数字。大多数现代系统使用 IEEE-754 双精度格式,它满足这些要求并且恰好占用 64 位。double1 x 10-371 x 1037

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

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

除此之外,它是敞开的。可以有系统 where 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是一个运算符int,而不是一个函数 - 如果它是一个类型名称,如or ,您只需要在操作数周围使用括号double


推荐阅读