如何在不使用 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。


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



目录
相关文章
|
2天前
|
存储 算法 编译器
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
55 1
|
2天前
|
存储 缓存 安全
C++数组全解析:从基础知识到高级应用,领略数组的魅力与技巧
C++数组全解析:从基础知识到高级应用,领略数组的魅力与技巧
54 1
|
2天前
|
存储 算法 搜索推荐
在C++编程语言中数组的作用类型
在C++编程语言中数组的作用类型
15 0
在C++编程语言中数组的作用类型
|
2天前
|
C++
.C++中结构体数组docx
.C++中结构体数组docx
14 0
|
2天前
|
存储 C++
【C++模板】模板实现通用的数组
【C++模板】模板实现通用的数组
|
2天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
34 1
|
2天前
|
C++
C/C++】如何不使用 sizeof 求数据类型占用的字节数
C/C++】如何不使用 sizeof 求数据类型占用的字节数
|
2天前
|
C++ 索引
C++ 获取数组大小、多维数组操作详解
本文介绍了如何获取数组的大小和使用`sizeof()`运算符。`sizeof()`返回数组所占字节数,而非元素个数。要获取元素个数,需除以单个元素的大小。此外,文章展示了如何使用`sizeof()`遍历数组,包括多维数组。多维数组是数组的数组,可用来表示网格。文中以战舰游戏为例说明了多维数组的应用。最后提到了微信公众号`Let us Coding`以获取更多内容。
22 0
|
2天前
|
存储 C++ 索引
C++数组
C++数组
|
2天前
|
C++
C++语言学习数组和字符串应用案例
【4月更文挑战第8天】该文展示了C++中数组和字符串的应用案例。数组示例定义了一个整数数组并访问、修改其元素,计算了元素之和。字符串示例中,定义了一个字符串并遍历、修改字符,进行了字符串拼接、查找子字符串及替换操作。
12 3