c++高级---C/C++中如何获取数组的长度

精通C++:高效计算偶数长度子数组之和 在这篇技术文章中,我们将深入研究C++编程中一个有趣的问题:计算给定数组中所有偶数长度子数组的元素之和。这个话题不仅测试您对C++数组的理解,还测试您优化算法以提高性能的能力。 阅读详情

C、C++中没有提供 直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取长度,那么对于其他类型的数组如何获取他们的长度呢?其中一种方法是使 用sizeof(array) / sizeof(array[0]), 在C语言中习惯上在 使用时都把它定义成一个宏,比如

#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));}

而在C++中则可以使用模板 技术定义一个函数,比如:

template <class T>

int getArrayLen(T& array)

{

return (sizeof(array) / sizeof(array[0]));

}

这样对于不同类型的数 组都可以使用这个宏或者这个函数来获取数组的长度了。

若数组为存储字符串的字符数组,则所求得的长度还需要减一,即对于宏定义:

#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]) - 1 );} ,

对于函数定义:

template <class T>

int getArrayLen(T& array)

{

return (sizeof(array) / sizeof(array[0]) - 1);

}

原因为存储字符串的字 符数组末尾有一个'\0'字符,需要去掉它。

 

以下是两个Demo程序,一个C语言的,一个C++的:

【C语言】

#include <stdio.h>

#include <stdlib.h>

#define GET_ARRAY_LEN(array,len){len = (sizeof(array) / sizeof(array[0]));}

//定义一个带参数的 宏,将数组长度存储在变量len中

int main()

{

char a[] = {'1','2','3','4'};

int len;

GET_ARRAY_LEN(a,len)

//调用预定义的宏,取得数组a的长度,并将其存储在变量len中

printf("%d\n",len);

system("pause");

return 0;

}

【C++】

#include <iostream>

using namespace std;

template <class T>

int getArrayLen(T& array)   

{//使用模板定义一 个函数getArrayLen,该函数将返回数组array的长度

return (sizeof(array) / sizeof(array[0]));

}

int main()

{

char a[] = {'1','2','3'};

cout << getArrayLen(a) << endl;

return 0;

}
另: 在c++的函数里面,如果把一个数组作为参数传进去,那么这个数组就会退化为一个指针,因而就不知道这个数组的长度(这里的数组指的是静态的而不是new出来的)。

【我感觉C++实现的方法有问题,数组应该退化了啊,感觉应该向下面这样,先把代码写出来,有空再验证吧:

template<class T, int N>
void getArrayLen(T (&param)[N])
{
  //cout << "N= " << N << endl;

        return N;
}

int main()

{

char a[] = {'1','2','3'};

cout << getArrayLen(a) << endl;

return 0;

}

】

【今天有空验证了一下,上面两种模版求数组长度都是对的,那以后就用第一种吧,网上好像都是这样用的。】

C++数组长度计算的真相:从sizeof陷阱到std::size安全实践 在C++中,‘数组长度’并非单一概念,而是取决于类型本质与生命周期:C风格数组长度是编译期常量,std::array继承此特性,而std::vector的size()则是运行时动态值。其底层原理源于数组衰变(Array Decay)——当C风格数组作为函数参数传递时,会退化为指针,导致sizeof失效。这一机制直接关联begin/end迭代器协议和C++17引入的统一接口std::size,它通过模板特化安全提取编译期长度,并兼容标准容器。技术价值在于消除越界风险、支持泛型算法与RAII内存管理;典型应用场 阅读详情

相关推荐

纯JS实现SM3加密算法(兼容IE浏览器)

纯JS实现SM3加密,IE、谷歌、火狐等浏览器可以直接使用。

qianpou的博客 7352

C/C++中如何获取数组的长度

1. 算术表达式: #include    int main() {     int arr[4];     std::cout sizeof( arr ) / sizeof( arr[0] ) // 输出4 } 或者 #include    int main() {

brucethl的专栏 5万+

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

m0_52031708的博客 3841

C语言 | 数组与指针有哪些区别?

点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看编程笔记!与指针是不等价的,如:数组名不可以改变,而指向数组的指针是可以改变的。字符串指针指向的字符串中的字符是不能改变...

嵌入式大杂烩 777

C++实战:基于ONNX Runtime与OpenCV部署XFeat图像匹配模型

本文详细介绍了在C++环境中,利用ONNX Runtime与OpenCV高效部署XFeat图像匹配模型的完整流程。内容涵盖环境搭建、模型转换、核心代码封装及可视化实现,旨在帮助开发者将这一先进的深度学习模型集成到对性能要求苛刻的工业或嵌入式应用中,实现鲁棒且快速的特征匹配。

gpu4optimizer的博客 522

433M遥控器无线解码1527协议

433M遥控器无线解码1527协议,定时器轮询法

weixin_58595117的博客 1万+

【C / C++】带你系统的认识 string(上)

C++中的string类型是对字符数组的高级封装,提供了更便捷的字符串操作方式。与字符数组相比,string支持直接加和与赋值操作,结尾不自动添加\0。使用string需要包含<string>头文件,可通过cin和getline进行输入,并提供了size()方法获取字符串长度。此外,string还支持迭代器(iterator)操作,如begin()和end(),可以像指针一样遍历和修改字符串内容。这些特性使string比字符数组更易用,是C++处理字符串的首选方式。

jebdhs的博客 1414

从零构建:如何在VSCode中为HBuilderX迁移的UniApp项目搭建TypeScript支持环境

本文详细指导如何将HBuilderX中的UniApp项目迁移至VSCode并搭建TypeScript支持环境。通过pnpm包管理器初始化项目、配置tsconfig.json和vite.config.ts文件,实现工程化迁移与TypeScript深度集成,提升开发效率和代码质量。

book8的博客 1050

【C/C++】C/C++博客汇总

00. 目录 文章目录00. 目录01. C语言控制台相关文章02. Protocol Buffers相关文章 本博客不断更新,敬请关注… 01. C语言控制台相关文章 【C语言】控制台窗口图形界面编程(一)句柄和文本属性 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区 【C语言】控制台窗口图形界面编程(三)窗口相关设置 【C语言】控制台窗口图形界面编程(四):文本输出 【C语言】控...

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 7392

基于STM32和MPU6050的手势控制小车设计与实现

MPU6050传感器:用于检测手势变化,采集加速度和陀螺仪数据。STM32微控制器:处理MPU6050传感器的数据,根据手势变化控制小车的运动。电机驱动模块:接收来自STM32的控制信号,驱动小车的电机,实现小车的前进、后退、左转和右转。小车底盘:作为整个系统的机械部分,提供移动平台。MPU6050是一款集成了3轴加速度计和3轴陀螺仪的传感器,具有高精度、低功耗和小体积等特点。它通过I2C接口与微控制器通信,可以实时采集加速度和角速度数据,广泛应用于运动检测、姿态控制和手势识别等领域。

m0_57781768的博客 2308

从 SAP ABAP 到 S/4HANA,SAML 2.0 单点登录到底是怎么跑起来的

在很多 SAP 项目里,SSO 不是一个锦上添花的功能,而是系统能不能顺利上线的基本门槛。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1049

C/C++的各种指针或指针数组

C/C++的各种指针或指针数组 以下内容整理自知乎IceBear的回答,在此再次表示感谢。 最简单的例子,定义一个数组: int a[N]; 数组名 a 就是夹在 int 跟方括号之间 再来一个,指针数组: int (*p)[N] 也就是一个指针变量 p,它指向的东西是一个 int[N] 的数组 那举一反三,* 号改成 & 号: int (&a)[N] 这就是对一个数组的引用,引用的别名就是 a 当然,上一个例子里是 C++ 的,再举一个 C 的例子, typedef int i

windSnowLi 1万+

小龙虾们的好伙伴专栏导航

本文系统解析了OpenClaw技术架构,包括Channel层和网关层的设计实现,并与AgentSkills等技术方案进行对比。同时提供了OpenClaw的系列实用指南,涵盖小龙虾培养、客户资源管理、系统自动化巡检以及技术趋势助手构建等应用场景,帮助用户从零成本入门到高效落地应用,实现业务全流程自动化管理。

wend的博客 210

C++算法(7):数组长度获取解析,从基础技巧到现代最佳实践

在C++编程中,获取数组长度是一个常见但需要谨慎处理的操作。本文将深入探讨各种获取数组长度的方法,分析它们的适用场景和潜在陷阱。

2501_91516851的博客 1793

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C/C++没有数组

在其它高级语言里,不管是定义(声明)还是引用,a[i]或a[3]都是一个整体。在C/C++里,却是一个表达式:a[i]是运算符[]连接两个实体a和i。说C/C++并没有数组,有以下几条理由。理由一:C里没有数组形式。“数组”名a本身就是一个指针,与常规指针不同的是,它是一个不能移动的所谓常指针。如在函数外有定义:float a[3] = {1.0, 2.0, 3.0};首先

beepbug的专栏 5705

WINCC7.3破解文件

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

C/C++ 算法基础

我们以简单程序Hello World为例说明程序的基本框架。此程序在屏幕上输出一行“Hello World!}这段程序包括二个部分:1.#include #include是C语言的保留字,表示要把另一个文件中的内容包含在本文件中。是被包含的文件的文件名。C语言中提供了一些可以被直接拿来使用、能够完成某些特定功能的库函数,分别声明于不同的头文件中。例如:stdio.h中定义了一些与输入输出有关的函数。

纵横千里 捭阖四方 的专栏 1万+

c/c++中索引超出数组边界问题

C/C++没有数组在其它高级语言里,不管是定义(声明)还是引用, a[i] 或 a[3] 都是一个整体。在 C/C++ 里,却是一个表达式: a[i] 是运算符 [] 连接两个实体 a 和 i 。说 C/C++ 并没有数组 , 有以下几条理由。 理由一: C 里没有数组形式。“数组”名 a 本身就是一个指针,与常规指针不同的是,它是一个不能移动的所谓常指针。如在函数外有定义:float a[3] ...

Dakin_的博客 8127

<程序存储空间分配>|| Linux platform C/C++ 可定义数组的最大长度

先公布结论: 当数组存储于栈区时,最大长度受 Linux 为每个程序分配的最大栈区空间限制 —— Linux stack max size = 8 MB 当数组存储于非栈区时,最大长度只受当前计算机的剩余可用内存的限制 ???? ============== ┗|`O′|┛ 嗷~~ =============== 以下分析,就是讨论上述结论如何一步一步推导出来的! 重点关注:stack size -> (kbyte, -s) 8192 以上我们已经知道了 Linux 中一个程序的最大栈区大小为

记录的地平线 1160

php怎么比较数组长度_PHP获取数组长度的方法 函数参数的比较

在php中获取数组长度方法很简单,php为我们提供了两个函数可以计算一维数组长度,如count,sizeof都可以直接统计数组长度哦,下面我们来看几个实例吧。php如何获取数组的长度,使用php函数count(),或是sizeof()例如:代码如下:$arr = Array('0','1','2','3','4');echo count($arr);// 输出 5$arr = array('A',...

weixin_34999698的博客 929

c++高级---C/C++二维数组---与指针的关系

先上实例: #include "stdafx.h" #include int _tmain(int argc, _TCHAR* argv[]) {  int v[2][10] = {{1,2,3,4,5,6,7,8,9,10},{11,12,13,14,15,16,17,18,19,20}};  int (*a)[10] = v; //数组指针  std::cout  std::

Wait的专栏 1117

C语言指针数组和数组指针详解

C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C语言基础-第一个C程序 C语言基础-简单程序分析 VS2019编写简单的C程序示例 简单示例,VS2019调试C语言程序 C语言基础-基本算法 C语言基础-数据类型 C语言中的输入输出函数 C语言流程控制语句 C语言数组——一维数组 C语言数组——二维数组 C语言数组——字符数组 C语言中常用的6个字符串处理函

专注于C语言编程干货分享 5674

【C语言高级编程必修课】:如何在函数中准确传递数组长度并避免越界

掌握C语言中数组作为函数参数的长度处理技巧,避免越界错误。讲解指针传参、显式传递长度等方法,适用于嵌入式、算法等场景,提升代码安全性与可维护性,值得收藏。

BytePulse的博客 763

Java中的二维数组和C/C++中二维数组的区别

Java中没有真正的多维数组,可以建立数组的数组(的数组……),由此得到多维数组,其下每个数组是独立的,可以独立分配内存大小,跟C语言的数组不一样,C语言的数组每一维的内存大小都一样。在C/C++中,我们定义的变量所需的空间都是分配在栈上的,而new所需的空间都是分配在堆上的 在栈上的变量必须在代码中明确指出大小,所以在C/C++中定义数组必须指定大小 而JAVA中所有的变量都是引用,换个角度理

xiao_ma_优快云的博客 1789

java 设置数组长度_java如何增加数组长度

遇到一个面试题:在不使用list的add方法的情况下,动态的添加元素(大概是这个样子);ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,需学习arraylist的相关知识(http://www.cnblogs.com/ITtangtang/p/3948555.html);我首先想到的就是数组,但java中的数组是定长的,无法动态增加长度。如果要扩充数组,那就只能通过重新定义数...

weixin_35858091的博客 7254

C字符串与C++字符串的对比

C字符串与C++字符串的对比 C字符串 在C中,并没有字符串这个数据类型,而是使用字符数组来保存字符串。C字符串实际上就是一个以null('\0')字符结尾的字符数组,null字符表示字符串的结束。 C字符串定义时可以利用“=”号进行初始化,但是不能利用“=”对C字符串进行赋值。对C字符串的操作需要通过“string.h”头文件中定义的字符串处理函数。如: //字符串的初始化 char c[10] = "欢迎";

cnds123的专栏 1746

C/C++中的指针数组和数组指针

1. 指针数组   定义:int *p[n],由于[]的优先级高于*,p和[]结合成一个数组,该数组的元素存储的是int类型的指针,由于数组内容是指针,因此p+1的步长是sizeof(int*),在32位机器上,步长通常是4个字节;   int a[3][4];   int *p[3]; // 指针数组,具有3个类型为(int*)的元素;   p[0] = a[0]; // 将第...

bamei5868的博客 179
上一篇: c++通信---最简单的UDP程序
下一篇: 设计模式总结
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值