为什么 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*,而 *aint,这就是为什么 [=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