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 = int
和 sizeof(int) = 4
在你的机器上,而你需要 8
字节来存储内存地址(p
指向的地址)。
对于任何指针变量p
,变量p
本身就是指针,它的大小就是指针的大小。 *p
是 p
指向的内容,*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 个字节。
我正在使用下面的代码并获得不同的值。
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 = int
和 sizeof(int) = 4
在你的机器上,而你需要 8
字节来存储内存地址(p
指向的地址)。
对于任何指针变量p
,变量p
本身就是指针,它的大小就是指针的大小。 *p
是 p
指向的内容,*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 个字节。