让我们举一个复杂的例子来娱乐一下。说我们已经
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]
. Deferencing with[0]
将删除一个级别,我们已经char* [2]
; 因此sizeof(var[0]) = sizeof(char* [2])
= 8,假设两个 char 指针的大小为 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]
第一个维度的每个元素中都是 type char* [2]
,因此它的 size 是2 * sizeof(char*)
。
希望能帮助到你!