我在谷歌上搜索如何在C++中获取数组的长度。我找到了其中一种解决方案:
int arr[] = {1,2,3,4,5,6};
int size = *(&arr+1)-arr; //size is the length of the array
我曾经在
&arr
和arr
之间感到困惑,因为它们都给出了数组的基地址。我又去搜索了一下,发现当&arr + 1
时,它会给出不属于该数组的下一个内存块的地址;而当arr + 1
时,它会给出该数组中下一个元素的地址。以下是我编写的测试代码,以验证
&arr
和arr
之间的差异:int arr[] = {1,2,3,4,5,6};
printf("value of &arr + 1 - &arr = %d\n", &arr + 1 - &arr);
printf("value of *(&arr + 1) - arr = %d\n", *(&arr + 1) - arr);
第一个 printf
的答案是 1
,而第二个 printf
的答案是 6
。这是令我困惑的部分:既然 &arr
和 arr
都保存了同一数组的基地址,为什么结果不同呢?
*(&arr + 1) - arr == 6
。为什么?&arr
是一个指向 char [6] 数组的指针,因此&arr + 1
是一个指向 char [6] 数组之后地址的指针。当您对 数组指针 进行解引用时,您会得到一个 数组,通过访问转换为指针的地址,即在arr
之后的int
的地址。因此,*(&arr + 1) - arr
将给出int
数组中的 元素数量,就像sizeof arr / sizeof *arr
一样。 - David C. Rankinint size = *(&arr+1)-arr;
,抱歉让你感到困惑。你可以使用int size = (char*)*(&arr+1)-(char*)arr;
来获取数组中的 字节数。 - David C. Rankin