文章目录
- 一、获取数组的长度
- 1、sizeof(a)/sizeof(*a)
- 2、end(a)-begin(a)
- 二、获取标准库容器的长度
- 三、数组作为函数参数时,在函数中无法获取其长度
一、获取数组的长度
1、sizeof(a)/sizeof(*a)
C++没有专门求数组长度的内置函数,传统获取 C / C++数组长度的方法是使用 sizeof() 函数:
int a[]={1,2,3,4,5};
cout<<sizeof(a)/sizeof(*a)<<endl;
根据编译器会将数组自动转为指针的性质,*a其实就是 a[0],所以 sizeof(a)/sizeof(a[0]) 就是数组长度。
2、end(a)-begin(a)
学习了STL标准库之后,我们也可以用迭代器begin()和end()来计算数组长度,该方法也适用于所有标准库容器。
int a[]={1,2,3,4,5};
cout<<end(a)-begin(a)<<endl;
这里需要注意:SLT标准库容器使用迭代器的方法是 v.begin()和 v.end(),但数组不能写成 a.begin()和 a.end(),否则会报错。
二、获取标准库容器的长度
两种方法:
vector<int> v={1,2,3,4,5};
cout<<v.size()<<endl;
cout<<v.end()-v.begin()<<endl;
标准库容器可以通过size()成员函数获取其长度,也可以通过迭代器 v.end()-v.begin() 计算容器长度。
三、数组作为函数参数时,在函数中无法获取其长度
C++将数组作为指针来传递,而该指针指向数组的第一个元素。数组作为函数参数传递后,其大小信息丢失,只剩下数组中第一个元素的信息。因此在函数中无法获取其长度。
代码示例:
# x64系统
#include <opencv2\opencv.hpp>
#include <iostream>
void func(cv::Point2d value[]) {
std::cout << "[func] Array length = " << sizeof(value) / sizeof(*value) << std::endl;
std::cout << "[func] value = " << value << std::endl;
std::cout << "[func] sizeof(value) = " << sizeof(value) << std::endl;
std::cout << "[func] *value = " << *value << std::endl;
std::cout << "[func] sizeof(*value) = " << sizeof(*value) << std::endl;
}
int main()
{
cv::Point2d value[3] = { cv::Point2d(0.5,1),cv::Point2d(1,1.5),cv::Point2d(2,2) };
std::cout << "[main] Array length = "<<sizeof(value) / sizeof(*value) << std::endl;
func(value);
return 0;
}
输出结果的解释:
*value = [0.5, 1] 储存的是两个double类型的数据,共16个字节;因此 sizeof(*value) = 16
value 是储存cv::Point2d(0.5,1)数据的地址,在x64平台中,一个指针变量(或地址)的大小是8 byte; 因此sizeof(value) = 8
关于更多C++中数组作为函数参数的注意问题可见 C++中数组作为函数参数的注意问题
C++中数组作为函数参数是传址,因此不会保留数组长度信息,想要在函数中获得数组参数的长度,只能把数组长度也作为一个参数传到函数中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)