计算多维数组第一维

时间:2013-10-24 13:16:38

标签: c arrays pointers sizeof

现在我可以使用var_num=sizeof(var)/sizeof(var[0]);计算第一个维度,这是我研究过的方式并且正在使用我的代码,但问题是我不知道它是如何工作的,在我的输出中显示{ {1}}我无法弄清楚20和4来自何处,我只是想问20 / 4 = 5sizeof(var)这些值是如何获取的,这是什么意思它指的是第一维还是第二维?

sizeof(var[0])

5 个答案:

答案 0 :(得分:4)

让我们以一个复杂的例子来表示乐趣。说我们

char a[10][20][30] = { };

a的尺寸为sizeof(char) * 10 * 20 * 30;所以sizeof(a) = 6000(as per C99 standard)。 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*)应该作为基本因子,它将与每个维度的长度相乘。指针类型的大小取决于机器/体系结构类型和您使用的编译器。


我们每个人都会有不同的机器和不同的编译器,因此我们需要一个共同的参考来解释。在online compiler gives the result 40 / 8 = 5中运行您的计划。就像我上面所说的,根据平台和编译器,指针类型的大小会有所不同。

就像您在评论中写的一样,您的数组类型为char* [5][2]。使用[0]进行引用会删除一个级别,我们会char* [2];因此sizeof(var[0]) = sizeof(char* [2]) = 8,假设两个char指针的大小为8,这意味着该{4}在该在线机器上是4。在此基础上sizeof(char*) = 4 * 5 * 2 = 40,这是我们在输出中看到的,从而正确地将第一个数组长度设为5。

现在你的输出,如mentioned by glglgl,有点不同(也许你的机器或编译器的数据模型是16位);与编译器一起运行的机器似乎将 2 作为char指针的大小,即sizeof(var)。现在当你sizeof(char*) = 2时,我们var[0];它的大小等于char* [2] = 2 * 2 = 4.同样sizeof(char*) * 2 = 2 * 5 * 2 = 20.因此你输出sizeof(var)

  

我怎么知道第一维每个元素有多少位,我的意思是通过计算?

20 / 4 = 5中,第一维的每个元素都是char* [5][2]类型,因此它的大小为char* [2]

希望它有所帮助!

答案 1 :(得分:2)

20是数组的大小(以字节为单位),4是数组中单个元素的大小(以字节为单位)。数组具有相同类型的所有元素,因此具有相同的大小,因此您可以通过将其大小除以单个元素的大小来获得其长度。你不必使用你可以使用的第0个元素(如果你确定有一个带有这种索引的元素)。

答案 2 :(得分:2)

var[0]的类型为char **,因此它是一个指针。在32位系统上,地址占用4个字节,因此指针的大小为4。

sizeof(var)等于20,因为您的数组char **中有5个元素。

答案 3 :(得分:1)

“这是什么意思?”

sizeof(var[0])要求第一维中元素的大小。零是任意的但是常规的。所有元素都具有相同的大小。元素0是{"var0-0","var0-1"},是两个指针的数组。它的大小在32位系统上可能为8,在64位系统上为16。元素1将是{"var1-0","var1-1"}等等。

答案 4 :(得分:0)

你的回答非常有帮助,我得出的结论是,我的第一维的单个元素可以被不同地读取,这取决于我使用的位系统,其中位可以更大或更小,但值仍将保持比例我仍然会得到相同的价值。