我正在浏览找到一种方法来查找给定矩阵中的行数和列数,而没有任何其他信息,我找到了这个答案。
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]衰变为指针?
答案 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。
但浮动的大小与计算row
和column
的目的无关。无论row
如何,您拥有的代码始终会提供正确的column
和sizeof(float)
值。
答案 3 :(得分:1)
a
是一个二维数组。第一个维度是您拥有的总数组数,第二个维数是每个数组中的元素数。所以float a[9][2]
意味着你有9个数组彼此相邻(数组是连续的),每个数组都有两个元素。
现在,如果我们查看sizeof operator,我们会看到它被定义为
应用于数组时,结果是数组中的总字节数。这意味着n个元素的数组大小是元素大小的n倍。
表示数组。
现在我们知道sizeof
给出数组的总大小,如果给定一个数组,我们知道a[n]
代表a
中的两个元素数组,然后是{{ 1}}是第一个数组之一的总大小(以及所有这些数组都没有参差不齐),恰好是sizeof(a[0])
,因为8
是sizeof(float)
。