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

问题描述 投票:0回答: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

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

c sizeof
4个回答
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"
。从技术上讲,不这样做是未定义的行为


3
投票

sizeof(*p)
返回指针所指向的类型的大小,而 sizeof(p)
 返回指针本身的大小。

在您的情况下,机器上有

*p = int

sizeof(int) = 4
,而您需要
8
字节来存储内存地址(
p
指向的地址)。


3
投票

sizeof(p)

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

sizeof(*p)

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


0
投票
以下是指针变量的语法:

var_type *variable;
例如

int *k;


    '*'表示变量'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

我真的希望这能澄清。

© www.soinside.com 2019 - 2024. All rights reserved.