sizeof(*p) 和 sizeof(p) 的区别?

Difference between sizeof(*p) and sizeof(p)?

我正在使用下面的代码并获得不同的值。

int *p;

printf("Size of *p = %d", sizeof(*p));   // Here value is 4

printf("Size of p = %d", sizeof(p));    // Here value is 8

谁能解释一下,这到底是什么原因?

sizeof(*p) returns 的大小键入指针指向的内容sizeof(p) returns 指针本身的大小。

在你的情况下 *p = intsizeof(int) = 4 在你的机器上,而你需要 8 字节来存储内存地址(p 指向的地址)。

对于任何指针变量p,变量p本身就是指针,它的大小就是指针的大小。 *pp 指向的内容,*p 的大小是指向的内容的大小。

因此,当 sizeof(p) 报告 8 时,您就知道系统上的指针是 8 字节,并且您可能在 64 位系统上。

如果 sizeof(*p) 报告 4 那么您知道 int 的大小(在您的情况下 p 指向的是 4 字节,这在 32 位和 64 位系统上都是正常的。

sizeof(int*)sizeof(int) 会得到相同的结果。

哦,还有最后一点:要打印 sizeof 的结果(属于 size_t 类型),那么您应该真正使用 "z" 前缀和无符号类型说明符(因为 size_t 是无符号的)。例如 "%zu"。不这样做在技术上是 未定义的行为

sizeof(p)是指针本身的大小。这取决于地址总线的大小。这意味着对于 64 位系统,地址总线大小将为 64 位(8 字节),因此指针将为 8 字节长(这表明您的系统是 64 位)。在 32 位系统上,它的大小为 32 位(4 字节)。

sizeof(*p) 是指针类型的大小,即这里的 int。所以通常 int 是 32 位长,即 4 个字节。