求传入函数中的数组长度

C中关于能否在函数中求传入整型数组长度的问题 如果函数需要调用一个数组的长度值时,不能在函数的内部求,一定要在外部求好之后再传入函数内部 阅读详情
 摘自: http://blog.chinaunix.net/u2/75321/showart_1161698.html
 
一般来说数组传入函数里面后会退化为指针,sizeof则没有用了,所以一般都要多传入一个数组长度。但是还是有办法求长度的。
下面三个方法的原理都是利用array-size函数把数组的长度骗取 出来,而且利用&号过滤
指针.
template <int N>
struct size{
     static const int cnt = N;
};  
template <typename T, int N>
size <N> array_size(T (&a)[N]);
#define dimensionof(x) array_size(x).cnt


typedef unsigned char byte_t;

template <int N>
struct size_v1{
    
     byte_t c[N];
};  
template <typename T, int N>
size <N> array_size_v1(T (&a)[N]);
#define dimensionof_v1(x) sizeof(array_size(x).c)

template <typename T, int N>
byte_t (&dimen(T (&a)[N]) )[N];
#define dimmensionof_v2(x) sizeof(dimen(x))

更简单的实现

template <int N>
struct SIZE{
     static const int cnt = N;
};

template <typename T, int N>
int arr_size(T (&arr)[N]){

/*
     cout << sizeof(arr) / sizeof(T) << endl;//work well
     struct SIZE <N> s;//also work well
     cout << s.cnt << endl;

*/

     return SIZE <N> ::cnt;
}

数组作为参数传入函数时在函数体内不能正确获取到数组长度 问题描述 最近在关于数组的编程中发现这样一个问题:我想写一个函数模板以实现一个数组的排序,其中数组的大小是不确定的。我最开始的写法是: // A code block void sort(T arr[]) { int len; len = sizeof(arr) / sizeof(arr[0]); ...} 运行后发现只有数组的第一个元素输出。cout len后发现其值为4,是一个数据的长... 阅读详情

相关推荐

【Gazebo安装指南】Ubuntu22.04LTS环境下的高效配置与常见问题解决

本文提供了在Ubuntu 22.04 LTS系统上高效安装和配置Gazebo仿真环境的详细指南。针对Gazebo Classic版本,文章对比了通过ROS 2仓库和Ubuntu官方仓库两种主流安装方法,并重点解决了安装过程中常见的软件包定位、模型下载及图形驱动等问题,帮助用户快速搭建稳定的机器人仿真开发环境。

weixin_29279101的博客 435

如何获取数组长度?

****public static void main (String [ ] args){ //创建两个数组; string[ ] [ ]data = new string [ 2 ] [5 ] ; system.out.println(“第一个数组的长度”+data.length); system.out.println(“第二个数组的长度”+data[ 0 ].l...

weixin_45963194的博客 1980

手把手教你用CANopen SDO报文控制步进电机(附CIA402协议详解)

本文详细解析了如何通过CANopen SDO报文控制步进电机,深入讲解CIA402协议的核心架构、状态机模型及对象字典管理,并提供实战代码示例。从SDO报文构造到多轴同步控制,帮助开发者掌握工业级步进电机的精确控制技术,适用于自动化设备开发。

weixin_33737774的博客 485

STM32 学习之不定长数组的定义

通常情况下,keil、IAR 在定义数组的时候,都是需要指定数组的长度,但是我们大多数情况下是不知道我们输入的数据可能会有多长。 所以为了尽可能的包含所有的情况,通常的做法就是在定义数组的时候,将数组的长度定义的非常长。结果就会导致多数情况下,大量的内存空间被浪费了。 其实在C99新增的标准中是有关于这个的定义的,而且Keil和IAR 也是支持的。 下面我们来看看具体的实现方法: 一、在Keil ...

繁夜 1万+

攻防世界-Reverse-Game

攻防世界,game,逆向

wuh2333的博客 775

实战指南:将MediaPipe封装为Windows DLL,实现C++/C#高效调用

在计算机视觉和多媒体处理领域,跨平台框架为开发者提供了强大的算法模型和计算能力。其核心原理在于通过预训练的机器学习模型和优化的计算图,实现对图像、视频流中特定目标(如人脸、手势、姿态)的实时检测与分析。这项技术的价值在于能够将复杂的AI能力模块化,降低应用开发门槛。在实际工程实践中,为了突破特定语言生态的限制并优化部署流程,开发者常需将核心功能封装成独立的库。例如,将Google的MediaPipe框架封装为Windows动态链接库(DLL),就是一个典型的工程实践。此举能有效解决语言壁垒和部署简化问题,使

weixin_28691741的博客 360

STM32 Uart 接收不定长数据

      前面讲了Uart三种不同的方式接收数据,请参照《STM32 Uart及其配置》《STM32 Uart中断接收》《STM32 Uart DMA方式接收数据》,但是,它们都需要指定数据的长度,但实际应用中,会出现不定长度的数据,比如,某些模块的@命令,那么,如何接收不定长度的数据呢?今天,我们就来扒一扒STM32 Uart 变长数据的接收。       问题来了,变长数据包,我们如何确定...

2万+

解锁IPG Photonics SmartWeld系统,开启焊接新时代

SmartWeld 系统是 IPG Photonics 研发的一款先进的激光焊接解决方案,它隶属于自动化激光焊接系统类别 ,但却凭借一系列创新技术和独特设计,在众多同类产品中脱颖而出。该系统基于 IPG 在光纤激光技术领域的深厚积累,融合了先进的光束控制、智能监测和自动化控制等技术,旨在为工业制造提供高效、精准且稳定的焊接工艺。与传统激光焊接系统相比,SmartWeld 系统的独特之处首先体现在其光束控制技术上。它能够精确地调整激光束的能量分布、光斑大小和形状 ,以适应不同材料和焊接工艺的需求。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1428

C语言怎么样在函数中计算数组的长度?

C语言怎么样在函数中计算数组的长度。c语言数组指针的使用。

如果这是最后一页 能否让我把故事重写 1013

基于STM32单片机设计的红外人脸测温仪(QT上位机)

基于STM32单片机设计的红外人脸测温仪(QT上位机)是一种结合红外测温和人脸识别技术的设备,可以快速、非接触地测量人体体温并识别身份,广泛应用于人员密集场所的体温筛查和出入管理。基于STM32单片机设计的红外人脸测温仪是一种功能实用、易于使用的人脸测温设备,可以有效提高测温效率和识别准确率,广泛应用于各类人员密集场所的体温筛查和出入管理。

走向CTO的路上... 1719

ESP32-C3蓝牙透传通信的BLE协议栈工程实践

蓝牙低功耗(BLE)透传是一种基于GATT服务模型的数据透明传输机制,其核心原理在于Peripheral设备通过广播建立连接,并在GATT Server层暴露可读写特征值实现双向数据通道。该技术具备低功耗、跨平台兼容性强、开发门槛适中等优势,广泛应用于智能硬件、工业传感器与嵌入式网关等场景。在实际工程中,透传稳定性高度依赖BLE协议栈的分层协同——Link Layer负责可靠连接建立,GATT Server则定义数据交互语义;而ESP32-C3的AT指令集正是对这两层能力的封装调度。本文聚焦BLE透传的关键

weixin_29859471的博客 121

sizeof函数求数组长度

假设:  uint8 a[20],uint8 *p = &a; sizeof(a)   or     sizeof(&a)   ,输出结果为20 sizeof(p)    or     sizeof(*p)   ,输出结果为4 结论,只有直接通过数组名作为sizeof参数时,输出才是数组长度 如果通过    指针  或者   数组    作为函数参数时候,数组名会变成一个指针变量,

本地服务器 2658

UE5实现距离测量功能

UE5实现距离测量功能

专注GIS开发 6264

有一个数组,长度为100,里面元素分别是0-99不重复的数字, 现在随机删除两个元素,求被删除的两个元素分别是那两个数字。(设计一个函数,传入删除元素后的数组,返回两个被删除的数字)

有一个数组,长度为100,里面元素分别是0-99不重复的数字, 现在随机删除两个元素,求被删除的两个元素分别是那两个数字。(设计一个函数,传入删除元素后的数组,返回两个被删除的数字)...

weixin_57627684的博客 346

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C语言(冒泡排序 / 数组名表示的首元素地址及例外情况)

/void bubble_sort(int arr[], int sz) //不能在传入数组的函数中求数组长度,因为传入的数组实际上是首位元素地址,一个指针变量。//此处&arr + 1 ,跳过的是整个数组的地址,//打印整个数组的地址(打印结果与首元素的地址相同)//打印首元素的下一个元素地址。//1.sizeof(数组名),这里的数组名表示的是整个数组,计算的是整个数组的大小,单位是字节。//2.printf("%p", &arr) 这里的数组名表示整个数组,取出的是整个数组的地址。

yq1468286090的博客 264

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【C++中传递数组到函数时求数组长度问题】

学习记录: 最近学习c++时遇到传递数组到函数的问题,将数组作为实参传递给函数时,传递的是数组首地址,对形参使用sizeof()函数会返回数组变量的字节长度。 解决办法为: 问题描述 学习场景: 学习左神刷题挑战时,练习选择排序时遇到: #include<iostream> using namespace std; class Mysort { public: void Dosort(int a[],int len); }; void Mysort::Dosort(int a[

m0_49024672的博客 1617

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

c++中数组作为参数传入函数

前言:最近再看一个用c++写数组求逆矩阵的程序,那是相当的繁琐,但是很有趣。其中涉及了大量的数组运算,所以数组作为参数传入函数很重要,这里记录一下。 一维数组作为参数 1.我们除了要将数组名传入函数外,为了规范化,我们还要将数组的大小也要作为参数传入,而不是在函数内部去定义大小。即下面这种形式: int sum_arr (int att[] , int size) 2.我们学习c的时候知道数组...

zouxu634866的博客 7万+

c++函数输入参数为数组时怎么求长度

如果你只想知道答案: 静态数组,如果在函数里定义一个静态数组A,则在此函数里可以通过sizeof(A)/sizeof(A[0])求数组长度。 如果数组A在函数外定义,并且作参数传入函数,怎么在函数里求其长度?——没法求,一般我们会再多传入一个参数记录长度 动态数组,(1)用new创建的动态数组作参数时,在函数里同样也不能求长度,因此一般我们也会再多传入一个参数记录长度。 (2)参数为vec...

qq_40692109的博客 8407

C语言求数组长度

前言 C语言对于不同的数据类型的数组求长度方式稍微有不同的地方: 1,对于字符数组求长度 第一种使用strlen() #include<stdio.h> #include<string.h> int main() { char a[10]="dmeo"; printf("%d",strlen(a)); //strlen()检索到\0结束 } 输出: 第二种使用sizeof()来完成 #include<stdio.h> #include<strin

xinzhilinger的博客 3万+

关于将数组长度传入函数的一些探讨

清明时节雨纷纷,似乎又应验这句老话,反正西安是这样的。    由于清明放假,晚上就剩下自己一个人在宿舍了。没有太多不同,最突出的感觉只是多了份宁静和平和。看了些关于万进制高精度的打印资料,突然又联想起了前几天一直思考的关于将数组长度传入函数的问题,总结了一下。    把数组传入函数是个很常见的语言现象。同时将数组长度传入函数,这似乎是个根本算不上问题的问题。但是随着考虑的侧重点的偏移,也许会有

xiefubao的专栏 972

函数传入数组长度

c++编程的时,很多时候,我们需要给给一个函数传入一个数组的长度,不过因为c和c++在传入时,只是将数组的头指针地址(或者引用)传入,我们就无法确知数组长度了。也许有些人表示怀疑,接下来我们来看下面的一个实验: #include #define GET(arr11,len) {len=(sizeof(arr)/sizeof(arr[0]));}    //采用宏求解函数长度 int arrL

zhaowenchaofang的专栏 1882

C++中数组作为函数参数时为什么要传入数组长度

例子:将任意长度的整形数组传递给求和函数sum,返回数组中所有元素之和。 写法1: #include <iostream> using namespace std; int sum(int arr[]) { int sum = 0; int len = sizeof(arr) / sizeof(arr[0]); for (int i = 0; i < len; i++) { sum += arr[i]; } return sum; } int main() { int

ccJun-的博客 2679

C语言基础——当函数的传入参数是数组时,数组长度的计算

当函数的传入参数是数组时 我们看下面一段代码 void test1(int arr[]){ int len = sizeof(arr) / sizeof(arr[0]); printf("test1.len=%d\n", len); } int main(){ int arr[5] = { 1, 2, 3, 4, 5 }; int len = sizeof(arr) / sizeof(arr[0]); printf("main.len=%d\n", len); test1(arr);

qq_49044908的博客 4821

c++数组长度函数length_C语言数组传入函数获取数组长度的方法

在写C语言函数时,我们总想去把数组传入函数中( 例如:int function(int a[]) ),并得到其长度,事实上,本人经过多方面努力验证,发现在函数内获取其长度做不到的,当我们传入一个数组时,根据C语言规定,实际传入的形参是我们传入数组的指针。举个例子,如果主函数中有一个数组b[10],我们实际传入到函数function里的是int *a = b; 也就是说,我们传入到函数中的a是数组b...

weixin_39572409的博客 3568

c语言在函数中使用sizeof求数组长度

c语言sizeof的重要用途之一就是求数组长度,但是sizeof必须在数组定义的位置使用。不能作为参数传入函数并在函数中使用sizeof; 比如下边这个例子 函数中打印结果为; 数组的长度应该是5但是结果却是2,这是为什么呢?因为在函数里边,a只是作为一个指针,而不是a【】一整个数组,运行时编译器不知道以a表示的地址有多大。sizeof(a)只是一个指针的大小。 尝试如下: 结果为 而如果sizeof用在定义数组阶段就没事; 结果为 ...

qq_56671474的博客 9277
上一篇: C程序常用算法源码
下一篇: C++ STL基本容器比较
SearchLife
博客等级 码龄20年 51粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值