如何在不使用 sizeof 的情况下在 C/C++ 中找到数组的大小?

简介: 我们可以使用 sizeof 运算符找到数组的大小

「这是我参与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。


文章到这里就结束了,感谢各位的阅读,如有不正确的地方欢迎大家批评指正!



目录
相关文章
|
4月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
110 4
|
11天前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
26 5
|
8月前
|
存储 C++
C++指针数组
C++指针数组
64 1
|
4月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
5月前
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
53 4
|
5月前
|
C++ 索引
C++数组、vector求最大值最小值及其下标
C++数组、vector求最大值最小值及其下标
203 0
|
6月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
45 6
|
6月前
|
存储 安全 C++
开发与运维数组问题之声明一个数组如何解决
开发与运维数组问题之声明一个数组如何解决
51 6
|
6月前
|
存储 C++ 容器
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
77 5
|
5月前
|
安全 编译器 C语言
C++入门-数组
C++入门-数组