C 计算多维数组';第一维度

C 计算多维数组';第一维度,c,arrays,pointers,sizeof,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

现在我可以使用
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();
}
#包括
#包括
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]);
clrsc();
printf(“%d/%d=%d”、sizeof(var)、sizeof(var[0])、var_num);
getch();
}

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

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


sizeof(var)
等于20,因为类型为
char**
的数组中有5个元素。说我们已经

char a[10][20][30] = { };
a
的大小将是
sizeof(char)*10*20*30
;因此
sizeof(a)
=6000()<代码>一个可以看作是一个(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]
将删除一个级别,我们将
字符*[2]
;因此
sizeof(var[0])=sizeof(char*[2])
=8,假设两个char指针的大小是8,这意味着
sizeof(char*)
在该联机机器上是4。在此基础上,
sizeof(var)
=4*5*2=40,这就是我们在输出中看到的,因此正确地将第一个数组长度指定为5

现在您的输出,比如,有点不同(可能您的机器或编译器的数据模型是16位的);与编译器一起运行它的机器似乎给出了2作为字符指针的大小,即
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*)

希望有帮助

“零是什么意思?”


sizeof(var[0])
询问第一维度中元素的大小。零是任意的,但却是常规的。所有元素的大小都相同。元素0是由两个指针组成的数组。它的大小在32位系统上可能是8,在64位系统上可能是16。元素1将是
{“var1-0”,“var1-1”}
等等。

您的回答帮助很大,我得出结论,我的第一维度的单个元素可以根据我使用的位系统进行不同的读取,其中位可以更大或更小,但值将保持比例,并且我仍将获得相同的值

这些价值观令人难以置信。我在32位机器上得到
40/8=5
。40是总大小,8是一个条目的大小(它是
char*[2]
,所以我的第一维度中有5个元素。如果你在一行上做同样的事情,你会得到
8/4=2
,因为一行由两个条目组成,每个条目有4个字节。在64位机器上,结果分别是
80/16=5
16/8=2
。也许你的输出来自你以前版本的程序,它有一个维度数组中的n更少。你确定这就是你得到的输出吗?在我的系统中,我得到
40/8=5
(32位模式)或
80/16=5
(64位模式)。Read
var[0]
是两个
char*
的数组。它的大小应该是8或16。我花了很长时间才理解它。对不起,你能解释一下吗