一、获取数组的长度

1、sizeof(a)/sizeof(*a)

C++没有专门求数组长度的内置函数,传统获取 C / C++数组长度的方法是使用 sizeof() 函数:

int a[]={1,2,3,4,5};
cout<<sizeof(a)/sizeof(*a)<<endl;    //5

根据编译器会将数组自动转为指针的性质,*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;     //5

这里需要注意:SLT标准库容器使用迭代器的方法是 v.begin()和 v.end(),但数组不能写成 a.begin()和 a.end(),否则会报错。

二、获取标准库容器的长度

两种方法:

vector<int> v={1,2,3,4,5};
cout<<v.size()<<endl;       //5
cout<<v.end()-v.begin()<<endl;     //5

标准库容器可以通过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;
}

/*
[main] Array length = 3
[func] Array length = 0
[func] value = 000000BF949AFB48
[func] sizeof(value) = 8
[func] *value = [0.5, 1]
[func] sizeof(*value) = 16
*/

输出结果的解释:

*value = [0.5, 1] 储存的是两个double类型的数据,共16个字节;因此 sizeof(*value) = 16
value 是储存cv::Point2d(0.5,1)数据的地址,在x64平台中,一个指针变量(或地址)的大小是8 byte; 因此sizeof(value) = 8

关于更多C++中数组作为函数参数的注意问题可见 C++中数组作为函数参数的注意问题

C++中数组作为函数参数是传址,因此不会保留数组长度信息,想要在函数中获得数组参数的长度,只能把数组长度也作为一个参数传到函数中。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐