计算多维数组的第一维

Dad*_*dan 3 c arrays pointers sizeof

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

#include <stdio.h>
#include <conio.h>
void main(){
char *var[][2]={
        {"var0-0","var0-1"},
        {"var1-0","var1-1"},
        {"var2-0","var2-1"},
        {"var3-0","var3-1"},
        {"var4-0","var4-1"},
        };
int var_num=sizeof(var)/sizeof(var[0]);
clrscr();
printf("%d / %d = %d",sizeof(var),sizeof(var[0]),var_num);
getch();
}
Run Code Online (Sandbox Code Playgroud)

leg*_*s2k 6

让我们举一个复杂的例子来娱乐一下。说我们已经

char a[10][20][30] = { };
Run Code Online (Sandbox Code Playgroud)

的大小a将是sizeof(char) * 10 * 20 * 30;so sizeof(a)= 6000(根据 C99 标准)。a可以看作一个由 (10) 个字符组成的数组,由 (20) 个字符组成的数组。现在

  • 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]。遵循 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]元素都是类型char* [2],因此它的大小是2 * sizeof(char*)

希望能帮助到你!