c++ - 混淆确定数组的元素数

标签 c++ c pointers memory sizeof

我从我的讲师那里听说,sizeof(some pointer) 在机器中总是相等的。例如,如果是 64 位,所有指针都是 8 字节,在 32 位中是 4 字节。所以,当我想指定数组的大小时,我喜欢使用 sizeof

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

我假设上面的代码 int 需要 4,所以 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*);

如果在一台机器中每个指针都具有相同的大小,结果怎么可能是正确的?问题能解释一下吗? 编辑

I mixed up division by *arr and double pointer

最佳答案

指针的大小不是 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]);

此外,不要依赖此方法来确定数组中元素的数量。请注意,在运行时无法从 中的数组本身得知这一点,因为它没有存储在数组中。如果您想跟踪元素的数量,则需要存储该值。

虽然这在您第一次想到它时可能看起来很烦人,但根据您应该学习的经验,这样更好。因为它可以让你完全控制你的程序必须处理的数据,一旦你习惯了它,就很难相信只给你数组长度的语言,比如 python 的 len运营商。

关于c++ - 混淆确定数组的元素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33183698/

相关文章:

c++ - 使用存储在 vector 中的函数指针

c - 带有指针的段错误 : 11,

c++ - std::hex/std::oct 不工作(打印十进制值)

c++ - 使用 qsort() 时包含 C++ 字符串的类的排序不正确/错误

C++ 指向类和析构类的指针

java - 绕轴旋转椭圆

c++ - 插入节点时对链表进行排序

python - 检测套接字挂断而不发送或接收?

c - 在 char 指针数组中存储字符串的错误

c - 传递许多变量与传递结构