为什么arr[0]的大小是8字节?
How come does the size of arr[0] is of 8 bytes?
我正在浏览寻找一种方法来查找给定矩阵中的行数和列数,而没有任何额外的信息,我找到了这个答案。
给定一个矩阵,求出行数和列数
这是上面问题的第二个答案的代码片段:
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的大小对于计算row
和column
的目的是无关的。无论sizeof(float)
如何,您所拥有的代码总是会给出正确的row
和column
值。
a
是一个二维数组。第一个维度是数组的总数,第二个数字是每个数组中元素的数量。所以float a[9][2]
意味着你有9个数组彼此相邻(数组是连续的),每个数组有两个元素。
现在我们看一下sizeof操作符我们看到它被定义为
对数组。当应用于数组时,结果是数组中的总字节数。这意味着包含n个元素的数组的大小是元素大小的n倍。
那么现在我们知道sizeof
给出了数组的总大小,如果给定一个数组,我们知道a[n]
表示a
中两个元素数组中的一个,那么sizeof(a[0])
是第一个数组中的一个的总大小(由于数组不是锯齿状的,所以它们都是)碰巧是8
,因为sizeof(float)
是4
。
- 从不同线程使用int64的不同字节安全吗
- arr[-1]在c++中的奇怪行为
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 在java中读取c++字节的位字段
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 字节真的是最小可寻址单元吗
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 为什么arr[0]的大小是8字节?