在确定数组的元素号时出现混淆

confusion determining element number of an array

本文关键字:元素 数组      更新时间:2023-10-16

我听我的讲师说过,机器的sizeof(某个指针)总是相等的。例如,如果它是64位,所有指针都是8字节,在32位4字节。因此,当我想指定数组的大小时,比如

,我喜欢使用sizeof
int arr[] = {2, 5, -1, 10, 9};
int size = sizeof(arr) / sizeof(int)

我假设上面的代码中int4,那么20/4给出arr的元素数。

int arr[] = {2, 5, -1, 10, 9};
int size = sizeof(arr) / sizeof(int*)

我还假设sizeof(some pointer)采用4,因此20/4再次给出arr的元素数。

当我将其应用于double数组时,我感到困惑。我认为这行不通。但是,它可以工作。

double arr[] = {2, 5, -1, 10, 9};
int size = sizeof(arr) / sizeof(double*);

如果机器中每个指针的大小都相同,结果怎么可能是正确的?这个问题能解释清楚吗?编辑

我把*arr除法和双指针

搞混了

指针的大小不是double数组中元素类型的大小,因为double数组中的元素不是指针。

当你对数组应用sizeof时,它会以字节为单位给出数组的大小,在

的情况下
double arr[] = {2, 5, -1, 10, 9};

5 * sizeof(double)

sizeof(double) != sizeof(double *)。要获取数组中的元素个数你需要

sizeof(arr) / sizeof(double);

但是为了使它更易于维护,你可以只要求元素类型的大小,像这样

sizeof(arr) / sizeof(*arr);

sizeof(arr) / sizeof(arr[0]);

同样,不要依赖此方法来确定数组中元素的数量。请注意,在运行时,没有办法从c中的数组本身知道,因为它没有存储在数组中。如果要跟踪元素的数量,则需要存储该值。

当你第一次想到它时,这可能看起来很烦人,但随着你的经验,你应该学会,这样做更好。因为它可以让您完全控制程序必须处理的数据,一旦您习惯了它,就很难信任只给您数组长度的语言,例如python的len运算符。