哪个表达式是使用 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
。
我之所以想到这个原因是因为
printf("%d\n", sizeof(*dp));
: *dp
指向 value 这是一个 double 类型使其打印 8
(byte)
printf("%d\n", sizeof(dp));
:dp
是一个指针变量,在 64 位系统中是 8
byte,在 64 位系统中是 4
byte 32位系统.
我想知道我理解的是否正确,或者我是否将1和2的原因调换了。
你已经差不多明白了:
sizeof dp == sizeof (double *) == 8 (on your system)
sizeof *dp == sizeof (double) == 8 (on your system)
在您的特定系统 上,double
和double *
占用相同数量的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
.
在研究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
。
我之所以想到这个原因是因为
printf("%d\n", sizeof(*dp));
:*dp
指向 value 这是一个 double 类型使其打印8
(byte)printf("%d\n", sizeof(dp));
:dp
是一个指针变量,在 64 位系统中是8
byte,在 64 位系统中是4
byte 32位系统.
我想知道我理解的是否正确,或者我是否将1和2的原因调换了。
你已经差不多明白了:
sizeof dp == sizeof (double *) == 8 (on your system)
sizeof *dp == sizeof (double) == 8 (on your system)
在您的特定系统 上,double
和double *
占用相同数量的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
.