为什么 sizeof(*value) returns 与 c++ 中的 sizeof(value) 不同
Why does sizeof(*value) returns different value than sizeof(value) in c++
我很好奇这个:
int main()
{
int a[7];
std::cout << "Length of array = " << (sizeof(a)/sizeof(*a)) << " - " << sizeof(a) << " - " << sizeof(*a) << std::endl;
}
Returns
Length of array = 7 - 28 - 4
所以我的问题是:为什么我必须使用 (sizeof(a)/sizeof(*a))
来接收正确的尺寸,为什么 sizeof(*a)
returns 4
但 [=16] =] returns 28
?
数组的名称会衰减为指向第一个元素的指针。
*a == a[0]
*(1+a) == a[1]
以此类推
所以,整数指针是 4 个字节长,就像一个 int 变量。
另一方面,a
数组是一个长度为7的整数数组,所以整体大小是7 * 4 = 28
sizeof(a)
returns 28
因为数组中有 7 个元素,每个元素有 4 个字节长。
sizeof(*a)
returns 4
因为 *a
取消引用数组中的第一个元素(整数),它有 4 个字节长。
因此,sizeof(a) / sizeof(*a) == 28/4 == 7
编辑:
你不应该养成在 C++ 中以这种方式查找数组长度的习惯。最好保留另一个变量来存储数组的长度。 sizeof
是在编译时用定长数组计算的。如果您在可变长度数组上调用 sizeof
,它通常会 return 8 因为这是指针的大小(在 64 位系统上)。有关详细信息,请参阅 here。
a
在传递给函数、在运算符中使用或几乎以任何方式像变量一样使用时,会衰减为指针。 *a
指的是衰减指针指向的内容。换句话说,a
衰减为指向 a
中第一个值的 int*
,而 *a
是 int
,这就是为什么 [=17] =] 返回两种数据类型的不同大小。
通过语句 int a[7]
,您声明了一个大小为 7 的整数数组(此处只能存储 7 个整数元素)。
如果你使用语句sizeof(a)
,你得到size of a。您可能知道,它是 7 x 4
。 (为什么是 4?因为整数的大小是 4 个字节)。因此,如果需要得到数组的真实大小(即元素个数),则必须除以int
.
的大小
Why do I have to use (sizeof(a)/sizeof(*a))
to receive the right size, and why does sizeof(*a)
returns 4, but sizeof(a)
returns 28?
要回答这个问题,您必须知道数组名称实际上是指向数组第一个元素的指针(即在本例中,它指向 a[0]
。)那么,什么是 a[0]
?它是一个整数对吗?您可以将 sizeof(*a)
视为 sizeof(int)
。
由于 sizeof(int)
returns 4
,因此 sizeof(*a)
。
你得到 7(正确答案)的原因是:
sizeof(a) = 7 * 4
,
sizeof(*a) = 4
,因此
(sizeof(a)/sizeof(*a)) = 7
.
a
和*a
有不同的类型; int[7]
和 int
分别(忽略可能的左值引用)。
我们有:
sizeof(a[0])
= sizeof(*a)
= sizeof (int)
sizeof(a)
= sizeof (int[7])
= 7 * sizeof (int)
sizeof(a)/sizeof(*a)
= std::extent
<int[7]>::value
= 7
看来,对于您的配置,sizeof(int) == 4
。
我很好奇这个:
int main()
{
int a[7];
std::cout << "Length of array = " << (sizeof(a)/sizeof(*a)) << " - " << sizeof(a) << " - " << sizeof(*a) << std::endl;
}
Returns
Length of array = 7 - 28 - 4
所以我的问题是:为什么我必须使用 (sizeof(a)/sizeof(*a))
来接收正确的尺寸,为什么 sizeof(*a)
returns 4
但 [=16] =] returns 28
?
数组的名称会衰减为指向第一个元素的指针。
*a == a[0]
*(1+a) == a[1]
以此类推
所以,整数指针是 4 个字节长,就像一个 int 变量。
另一方面,a
数组是一个长度为7的整数数组,所以整体大小是7 * 4 = 28
sizeof(a)
returns 28
因为数组中有 7 个元素,每个元素有 4 个字节长。
sizeof(*a)
returns 4
因为 *a
取消引用数组中的第一个元素(整数),它有 4 个字节长。
因此,sizeof(a) / sizeof(*a) == 28/4 == 7
编辑:
你不应该养成在 C++ 中以这种方式查找数组长度的习惯。最好保留另一个变量来存储数组的长度。 sizeof
是在编译时用定长数组计算的。如果您在可变长度数组上调用 sizeof
,它通常会 return 8 因为这是指针的大小(在 64 位系统上)。有关详细信息,请参阅 here。
a
在传递给函数、在运算符中使用或几乎以任何方式像变量一样使用时,会衰减为指针。 *a
指的是衰减指针指向的内容。换句话说,a
衰减为指向 a
中第一个值的 int*
,而 *a
是 int
,这就是为什么 [=17] =] 返回两种数据类型的不同大小。
通过语句 int a[7]
,您声明了一个大小为 7 的整数数组(此处只能存储 7 个整数元素)。
如果你使用语句sizeof(a)
,你得到size of a。您可能知道,它是 7 x 4
。 (为什么是 4?因为整数的大小是 4 个字节)。因此,如果需要得到数组的真实大小(即元素个数),则必须除以int
.
Why do I have to use
(sizeof(a)/sizeof(*a))
to receive the right size, and why doessizeof(*a)
returns 4, butsizeof(a)
returns 28?
要回答这个问题,您必须知道数组名称实际上是指向数组第一个元素的指针(即在本例中,它指向 a[0]
。)那么,什么是 a[0]
?它是一个整数对吗?您可以将 sizeof(*a)
视为 sizeof(int)
。
由于 sizeof(int)
returns 4
,因此 sizeof(*a)
。
你得到 7(正确答案)的原因是:
sizeof(a) = 7 * 4
,
sizeof(*a) = 4
,因此
(sizeof(a)/sizeof(*a)) = 7
.
a
和*a
有不同的类型; int[7]
和 int
分别(忽略可能的左值引用)。
我们有:
sizeof(a[0])
=sizeof(*a)
=sizeof (int)
sizeof(a)
=sizeof (int[7])
=7 * sizeof (int)
sizeof(a)/sizeof(*a)
=std::extent
<int[7]>::value
= 7
看来,对于您的配置,sizeof(int) == 4
。