c - 哪个表达式是使用 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
指向双精度类型的值,使其打印8
(字节)printf("%d\n", sizeof(dp));
: thedp
是一个指针变量,使其8
在 64 位系统4
中为字节,在 32 位系统中为字节。
我想知道我的理解是否正确,或者我是否理解了 1 和 2 的原因。
解决方案
你已经明白了:
sizeof dp == sizeof (double *) == 8 (on your system)
sizeof *dp == sizeof (double) == 8 (on your system)
在您的特定系统上,两者都double
占用double *
相同数量的空间。但是,这不一定是真的。
浮点类型必须能够以最小精度表示最小范围的值- 对于,它必须能够表示至少范围内的值并提供至少10 位精度的十进制数字。大多数现代系统使用 IEEE-754 双精度格式,它满足这些要求并且恰好占用 64 位。double
1 x 10-37
1 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
。
推荐阅读
- matplotlib - 排序子图中的标签,使用 fig.add_axes 创建
- java - 如何处理 Mallet 中 cmd 行中的空格?
- android - 如何为 Android Studio 制作 SDK 位置
- php - 单击按钮时如何仅更新 1 行而不是所有行
- mysql - MySql 8.0.15 安装失败 Invalid Server Template
- c++ - 将 C++ 方法参数转换为模板参数失败并出现编译错误
- javascript - 语义 UI 日历模式不弹出
- google-chrome-extension - 用户关闭 Chrome 时关闭本机主机
- alexa - 如何对因 INVALID_REQUEST_EXCEPTION 失败的 ASK ChangeReport 进行故障排除
- firebase - Fabric 中的重复事件流到 Firebase-> Google Big Query 流