3

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

#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();
}
4

5 回答 5

4

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

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*)

希望能帮助到你!

于 2013-10-24T13:30:18.623 回答
2

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

于 2013-10-24T13:19:32.427 回答
2

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

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

于 2013-10-24T13:20:11.073 回答
1

“那个零是什么意思?”

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

于 2013-10-24T13:31:10.373 回答
0

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

于 2013-10-24T15:00:38.597 回答