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

How come does the size of arr[0] is of 8 bytes?

本文关键字:8字节 arr 为什么      更新时间:2023-10-16

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

给定一个矩阵,求出行数和列数

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

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("%dn",row);
    printf("%dn",col);
    return 0;
}

为什么sizeof(a[0])结果是8?在我的理解中,指针在32位拱中具有4字节的通用大小,在64位拱中具有8字节的通用大小。我在两台机器上都打印出了(a[0])的大小,答案仍然是8。有人知道为什么吗?

编辑:我的意思是说[0]不会衰减成指针吗?

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

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

(1)见ISO 9899:2011 6.5.3.4

对操作符尺寸的规范

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

"array decay"规则见6.3.2.3/3:

除非它是sizeof操作符的操作数,或者一元&操作符,或用于初始化数组的字符串字面值类型为"类型的数组"的表达式被转换为类型为"指向类型的指针"的表达式

为数组对象的元素,且不是左值。

但是a[0]是一个地址,对吗?

不,a[0]是一维数组。在几乎所有情况下,它都会衰变成指针。然而,在sizeof操作的情况下,您将得到两个不同的答案。

由于a[0]是2个浮点数的1D数组,因此sizeof(a[0])的值为8。

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

但是float的大小对于计算rowcolumn的目的是无关的。无论sizeof(float)如何,您所拥有的代码总是会给出正确的rowcolumn值。

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

现在我们看一下sizeof操作符我们看到它被定义为

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

对数组。

那么现在我们知道sizeof给出了数组的总大小,如果给定一个数组,我们知道a[n]表示a中两个元素数组中的一个,那么sizeof(a[0])是第一个数组中的一个的总大小(由于数组不是锯齿状的,所以它们都是)碰巧是8,因为sizeof(float)4