我正在使用下面的代码并获得不同的值。
int *p;
printf("Size of *p = %d", sizeof(*p)); // Here value is 4
printf("Size of p = %d", sizeof(p)); // Here value is 8
谁能解释一下,这背后到底是什么原因?
对于任何指针变量
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)
返回指针所指向的类型的大小,而 sizeof(p)
返回指针本身的大小。在您的情况下,机器上有
*p = int
和
sizeof(int) = 4
,而您需要
8
字节来存储内存地址(
p
指向的地址)。
sizeof(p)
是指针本身的大小。这取决于地址总线的大小。这意味着对于 64 位系统,地址总线大小将为 64 位(8 字节),因此指针将为 8 字节长(这表明您的系统是 64 位)。在 32 位系统上,它的大小将为 32 位(4 字节)。
sizeof(*p)
是指针类型的大小,即这里的
int
。所以通常
int
是 32 位长,即 4 个字节。
var_type *variable;
例如int *k;
假设我们有一个“整数”类型的变量“v”,其值为“100”:
int v = 100;
当 v 被声明时,它被存储在一个地址(内存上的一个位置)中。它占用的空间取决于变量的类型。我们假设 64 位系统如下图所示(变量类型 - 大小):char - 1 个字节; int - 4 字节; 浮点数 - 4 字节
因此,对于整数 (int),分配的内存是 4 个字节 - 在一个地址处。
回想一下,int v = 100;
v的地址可以通过与运算符前缀&(C语言)得到:&v
printf("The address of v is: %lu", &v); //this prints the address of v in memory
现在,让我们使用我们的指针 - k:
k = &v; //pointer is assigned a value that is equal to the address of variable v
请注意
任何“指针”的默认大小(假设是 64 位系统)都是 8 字节。这意味着我们的指针 k 的大小为 8 个字节。
printf("The size of pointer k is: %d", sizeof(k));
printf("p 的大小 = %d", sizeof(p)); // 这里的值为 8那么*k的大小(等于“整数”v的地址值)是4个字节。
回想一下 sizeof(int) = 4 字节。
printf("The size of *k is: %d", sizeof(*k));
printf("*p 的大小 = %d", sizeof(*p)); // 这里的值为 4我真的希望这能澄清。