博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++求任意数组长度
阅读量:4993 次
发布时间:2019-06-12

本文共 911 字,大约阅读时间需要 3 分钟。

如果你企图试用类似如下函数计算数组长度:

//数组退化为指针,这里算不出正确的数组长度int get_array_length0(int a[])//这里等同于int*{    return sizeof(a)/sizeof(int);}

这里sizeof(a)是返回int*指针大小,因为数组在参数传递的时候为地址传递,实际上调用这个函数int[]退化为了int*指针。

看看Xcode下的warning:

 

所以,我们需要数组在参数传递的时候需要使用数组引用,int (&a)[],这个声明类型不完备(incomplete type)

这样做的话,如果你再对a进行sizeof,则会有一个编译错误:

invalid application of 'sizeof' to an incomplete type  int[] .这里sizeof计算一个数组大小,需要它的类型信息是完备的,即包含数组大小。

所以你仅可在数组定义处使用sizeof,因为定义处数组的类型信息是完备的。

并且你也没有办法调用这个函数,因为类型不完备,所以类型是和数组int a[5]匹配不上的。

 

于是最终,我们需要函数模板来解决这个问题。简单来说就是  引用

//类型参数+非类型参数+数组引用//非类型模板参数 绑定实参必须是常量表达式template 
int get_array_length(T (&array)[N]) { return sizeof(array)/sizeof(T);}//或者直接声明为类型引用 T=Type (&)[N]template
int get_array_length2(T& array){ return sizeof(array)/sizeof(array[0]);}int main(){ int a[5]={
1,2,3,4,5}; cout<
<

 

转载于:https://www.cnblogs.com/kyokuhuang/p/4371086.html

你可能感兴趣的文章
hive跑mapreduce报java.lang.RuntimeException: Error in configuring object
查看>>
ArcGIS中的坐标系统定义与投影转换方法
查看>>
机械臂的碰撞检测资料
查看>>
[UnityShader基础]01.渲染队列
查看>>
字符串转整型C++
查看>>
随机生成红包算法
查看>>
Datatable get请求传参应用
查看>>
杭电1170
查看>>
3unit8
查看>>
kettle与各数据库建立链接的链接字符串
查看>>
【转】Apache Solr 访问权限控制
查看>>
LoadRunner压力测试实际运用的使用方法
查看>>
项目管理理论与实践(1)——企业项目管理介绍
查看>>
MySql学习20----数据库范式
查看>>
[Mark]The problems & solutions of vmware vsphere
查看>>
在centos7 上部署 vuepress
查看>>
struts2中的标签
查看>>
Beta版总结会议
查看>>
建造者模式(Builder Pattern)
查看>>
ajax&模板引擎
查看>>