「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」
- 难度等级: 困难
我们可以使用 sizeof 运算符找到数组的大小,如下所示。
// 查找 arr[] 的大小并存储在 'size' int size = sizeof(arr)/sizeof(arr[0]); 复制代码
我们可以在不使用 sizeof 运算符的情况下做同样的事情吗?
方法一(自己写sizeof)给定一个数组(你不知道数组中元素的类型),不使用sizeof运算符,求数组中元素的总数?
一个解决方案是我们自己写的sizeof操作符
// C++ 程序通过编写我们的 sizeof 来查找数组的大小 #include <bits/stdc++.h> using namespace std; // 用户定义的大小宏 # define my_sizeof(type) ((char *)(&type+1)-(char*)(&type)) int main() { int arr[] = {1, 2, 3, 4, 5, 6}; int size = my_sizeof(arr)/my_sizeof(arr[0]); cout << "Number of elements in arr[] is " << size; return 0; } 复制代码
输出 :
Number of elements in arr[] is 6 复制代码
方法 2(使用指针 hack)
与上述解决方案相比,以下解决方案非常简短。可以使用表达式找出数组 A 中的元素数
int size = *(&arr + 1) - arr; 复制代码
// C++ 程序通过使用指针 hack 来查找数组的大小。 #include <bits/stdc++.h> using namespace std; int main() { int arr[] = {1, 2, 3, 4, 5, 6}; int size = *(&arr + 1) - arr; cout << "Number of elements in arr[] is " << size; return 0; } 复制代码
输出 :
Number of elements in arr[] is 6 复制代码
这是如何运作的?在这里,指针算术发挥了它的作用。我们不需要将每个位置显式转换为字符指针。
&arr ==> 指向 6 个元素的数组的指针。 [见本对之间&的常用3差 和ARR]
(&arr + 1) ==> 的为6点的整数地址 指针类型是指针阵列 的6点的整数。
*(&arr + 1) ==> 与 (&arr + 1) 的地址相同,但 指针类型为“int *”。
*(&arr + 1) - arr ==> 由于 *(&arr + 1) 指向 地址 arr 前面6 个整数,因此两者的差 为 6。
文章到这里就结束了,感谢各位的阅读,如有不正确的地方欢迎大家批评指正!