C/C++学习之求数组长度方案

c++中没有求数组长度的默认函数,只能自己写。但经常有初学者把sizeof(), size(), length(), strlen() 混淆。本篇博文具体解释一下如何求数组长度和这四个函数,以及可能遇到的问题。

  • C++求数组长度为:
1
int arr_length = sizeof(arr) / sizeof(arr[0]);
  • 为了方便使用,在C语言中常定义宏来求数组长度
1
2
3
\#define ARR_LEN(arr, length){
truelength = sizeof(arr) / sizeof(arr[0]);
}
  • 使用时,直接调用宏函数即可,如
1
2
3
4
5
int arr[]={1,2,3,4,5};
int len;
ARR_LEN(arr, len); //此时len赋值为5
  • 在C++中,也可以定义模板函数
1
2
3
4
5
template <class T>
int getArrayLen(T &arr){
truereturn sizeof(arr) / sizeof(arr[0]);
}
  • 使用时,调用模板函数,如
1
2
3
string arr[]={"abc", "ab", "abcde", "1234567", "890"};
int len=getArrayLen(arr); //此时len赋值为5
  • 当数组传入函数时,传入的是指针,指针仅指向数组头arr[0],不带有任何长度信息; 所以在传入数组时,要把数组长度同时传入函数。

  • 可以考虑一下,下面这个函数调用时,会输出什么?

1
2
3
4
5
void length_array(int arr[]){
trueint len=getArrayLen(arr);
truecout << "len=" << len << ", sizeof(arr)= " << sizeof(arr) << endl;
}

Output: len=1, sizeof(arr)=4;

这是因为arr是指针,而指针所占空间是4个字节。

所以sizeof(arr)/sizeof(arr[0])=1。

  • 请牢记:如果把数组作为参数传入函数,那么这个数组会退化为一个指针 int *arr。

  • 下面说一下size(), length(), strlen()

  • 先说 size() 和 length(),这两个方法都要先 include ,两者使用起来无任何差别。即str.size() == str.length() 为真。

  • 引用cplusplus.com中的话:

Both string::size and string::length are synonyms and return the same value, which is the length of the string, in terms of bytes.

  • 而 strlen() 是中的,是C语言的遗留物。

  • 引用cplusplus.com中的话:

cstring::strlen returns the length of the C string str. In C++, char_traits::length implements the same behavior.

  • 即 strlen(str) == str.length() == str.size() 为真。
  • 参考文献及资料

C++官方英文文档

CSDN博客: C/C++中如何获取数组的长度?

坚持原创技术分享,您的支持将鼓励我继续创作!
0%