混淆确定数组的元素编号

snr*_*snr 0 c c++ memory pointers sizeof

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

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

我假定上面的代码的int需要4,所以20/4给出了元件的数目arr.

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

我也假设sizeof(some pointer)take 4,所以20/4再次给出了元素的数量arr.

当我将它应用于double数组时,我很困惑.我认为它应该不起作用.但是,它有效.

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

如果每个指针在一台机器中占用相同的大小,结果怎么样呢?问题可以解释一下吗?编辑

我把*arr和双指针混合在一起

Iha*_*imi 5

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

当你应用于sizeof数组时,它给出了数组的大小(以字节为单位)

double arr[] = {2, 5, -1, 10, 9};
Run Code Online (Sandbox Code Playgroud)

它的

5 * sizeof(double)
Run Code Online (Sandbox Code Playgroud)

sizeof(double) != sizeof(double *).所以要实际获得所需数组中的元素数量

sizeof(arr) / sizeof(double);
Run Code Online (Sandbox Code Playgroud)

但为了使其更易于维护,您可以询问像这样的元素类型的大小

sizeof(arr) / sizeof(*arr);
Run Code Online (Sandbox Code Playgroud)

要么

sizeof(arr) / sizeof(arr[0]);
Run Code Online (Sandbox Code Playgroud)

此外,不要依赖此方法来确定数组中的元素数.请注意,在运行时,无法从的数组本身知道它,因为它不与数组一起存储.如果要跟踪元素数量,则需要存储该值.

虽然这在您第一次想到它时可能看起来很烦人,但是根据您应该了解的经验,这样做会更好.因为它可以让你完全控制你的程序必须处理的数据,一旦你习惯了它,就会很难相信那些像python的len运算符一样给你数组长度的语言.