为什么arr [0]的大小是8个字节?

时间:2016-08-26 11:30:24

标签: c++ c

我正在浏览找到一种方法来查找给定矩阵中的行数和列数,而没有任何其他信息,我找到了这个答案。

Given a matrix, find number of rows and columns

这是上述问题第二个答案的代码段:

int main()
{
    float a[9][2]={{0,1},{1,1}};
    int row=(sizeof(a)/sizeof(a[0]));
    int col=(sizeof(a)/sizeof(a[0][0]))/row;
    printf("%d\n",row);
    printf("%d\n",col);
    return 0;
}

sizeof(a [0])如何变成8?根据我的理解,指针在32位拱中具有4字节的通用大小,在64位拱中具有8字节。我在两台机器上打印出sizeof(a [0]),答案仍然是8。 有谁知道为什么?

编辑:我的意思是说不会[0]衰变为指针?

4 个答案:

答案 0 :(得分:11)

在发布的代码中没有任何指针使用。当作为操作数传递给sizeof(1)时,数组不会衰减到指向第一个元素的指针。

  • a是一个类型为float [9][2]的2D数组。
  • a[0]是此2D数组中的第一个项目,它是float [2]类型的一维数组。
  • sizeof(a)给出了2D数组的大小,相当于sizeof(float) * 9 * 2
  • sizeof(a[0])给出1D数组的大小,相当于sizeof(float) * 2
  • float显然是你系统上的4个字节,4 * 2 = 8。

(1)参见ISO 9899:2011 6.5.3.4中的sizeof运算符规范:

  

当应用于具有数组类型的操作数时,结果为   数组中的总字节数。

"阵列衰变的规则"见于6.3.2.1/3:

  

除非它是sizeof运算符的操作数,或者是一元&   operator,或者是用于初始化数组的字符串文字,a   具有类型''数组类型''的表达式将转换为   带有''指向类型'的指针的表达式,指向初始值   数组对象的元素,而不是左值。

答案 1 :(得分:5)

  

但是[0]是一个地址吗?

不,a[0]是1维数组。几乎在所有情况下它都会衰减到指针。但是,对于sizeof操作,您将获得不同的答案。

由于a[0]是包含2个浮点数的一维数组,sizeof(a[0])得到8。

答案 2 :(得分:3)

a[0]是一个包含2个浮点数的数组(float[2])。因此,sizeof(a[0])相当于代码中的sizeof(float[2])。在您的平台上,sizeof(float)为4,因此sizeof(a[0])为8。

但浮动的大小与计算rowcolumn的目的无关。无论row如何,您拥有的代码始终会提供正确的columnsizeof(float)值。

答案 3 :(得分:1)

a是一个二维数组。第一个维度是您拥有的总数组数,第二个维数是每个数组中的元素数。所以float a[9][2]意味着你有9个数组彼此相邻(数组是连续的),每个数组都有两个元素。

现在,如果我们查看sizeof operator,我们会看到它被定义为

  

应用于数组时,结果是数组中的总字节数。这意味着n个元素的数组大小是元素大小的n倍。

表示数组。

现在我们知道sizeof给出数组的总大小,如果给定一个数组,我们知道a[n]代表a中的两个元素数组,然后是{{ 1}}是第一个数组之一的总大小(以及所有这些数组都没有参差不齐),恰好是sizeof(a[0]),因为8sizeof(float)