让我们来看一个有趣的复杂例子。假设我们有
char a[10][20][30] = { };
a
的大小将为sizeof(char) * 10 * 20 * 30
; 因此sizeof(a)
= 6000 (C99标准)。 a
可以看作是(10)个数组,每个数组包含(20)个数组,每个数组包含(30)个字符。
a[0]
将少一个维度,得到一个包含(20)个数组,每个数组包含(30)个字符的数组
a[0][0]
将给出一个包含(30)个字符的数组
a[0][0][0]
是一个字符。
在所有这些示例中,0
仅是相应数组级别的第一个元素。
现在,通过执行
sizeof(a)/sizeof(a[0])
来找到数组的长度是一种基于上述逻辑的技巧。
sizeof(a[0])
只是一个由20个30个字符的数组组成的数组的大小,即600。
sizeof(a) / sizeof(a[0])
= 6000/600 = 10,返回第一维的长度。类似的数学运算也可以用于更高的维度。
由于在您的问题中,您有一个指针类型
char*
,应将
sizeof(char*)
作为基本因素,该因素将乘以每个维度的长度。指针类型的大小取决于您使用的机器/架构类型和编译器。
每个人使用不同的计算机和编译器,因此我们需要一个共同的参考来进行解释。在
在线编译器中运行您的程序,结果为
40 / 8 = 5
。正如我之前所述,根据平台和编译器的不同,指针类型的大小也会有所变化。
正如您在注释中写的那样,您的数组是
char* [5][2]
类型。使用
[0]
解引用将删除一级,我们得到
char*[2]
; 因此,
sizeof(var[0])=sizeof(char*[2])
=8,表示两个字符指针的大小为8,在该在线机器上,这意味着
sizeof(char*)
为4. 基于此,
sizeof(var)
=4 * 5 * 2 = 40,这就是我们看到的输出,正确给出了第一个数组长度为5。
现在你的输出结果,就像
glglgl提到一样,有点不同(也许是你的机器或编译器的数据模型是16位); 与你运行它的机器和编译器相结合,似乎给出
2作为char指针的大小,即
sizeof(char*) = 2
。现在当你执行
var[0]
时,我们有
char* [2]
;它的大小等于
sizeof(char*) * 2
= 2 * 2 = 4。同样
sizeof(var)
= 2 * 5 * 2 = 20。因此你的输出是
20 / 4 = 5
。
我如何通过计算知道第一维每个元素有多少位,我的意思是?
在
char* [5][2]
中,第一维的每个元素都是类型
char* [2]
,因此它的大小为
2 * sizeof(char*)
。
希望能有所帮助!
40 / 8 = 5
。40是总大小,8是一个条目的大小(它是一个char * [2]
),所以我在第一维有5个元素。如果你在单行上做同样的事情,你会得到8 / 4 = 2
,因为一行由2个每个4字节的条目组成。 - glglgl80 / 16 = 5
和16 / 8 = 2
。 - glglgl40 / 8 = 5
(在32位模式下)或80 / 16 = 5
(在64位模式下)。 - pburka