在编写代码的时候,我们经常需要用到数组长度,如排序,逆置等操作,如果没有数组长度,代码复杂度会增加很多,也会让人感觉无从下手。
其实字符串函数是提供长度查询函数的,strlen();但是其它数组没有这个函数,所以想写一个求通用数组长度获取的函数。
一开始我是这样写的,使用C++的模板类:
template <typename T>
int ArrayLen(T src[])
{
return (sizeof(src)) / (sizeof(src[0]));
}
但实际上这样写,无论传进去的数组长度是多少,返回的值只有1或者0;因为作为函数的形参,所有数组都会被转化为指针,实际上形参那里的数组是指针*src,因为src[0]是指第一位数据的地址。根据类型的定义以及编译环境的区别,得到的数据也有不同,以上代码在32位编译环境下,传进去的数据为int类型是,返回值为4/4=1;如果传进去的类型为double,则返回值为4/8=0;
为了避免上述情况出现,我使用别名来进行参数传递:
template <typename T>
int ArrayLen(T& src)
{
return (sizeof(src)) / (sizeof(src[0]));
}
以上代码就是正确的。
如果是字符数组,代码就要有所变动:
template <typename T>
int ArrayLen(T& src)
{
return (sizeof(src)) / (sizeof(src[0]))-1;
}
因为‘\0’结束符是不算入字符长度的,但它依旧占用一个数据位。
也可以用宏定义的写法:
#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));}