在C++中使用数组作为函数参数,在传参数的时候有两种传法
第一种:传指针
这时候就不用在意数组长度的问题
准确地说,这种定义方法并不是把数组作为参数,只是定义了个指针类型的参数,写的形式像数组罢了。把数组传给如此定义的函数,数组就退化成一个指针,同时丢失了长度信息。
void f5(int* arr) {}
第二种:传数组
这时候要带一个长度,因为sizeof(arr)
的值是sizeof(int*)
,这样有问题
void printArray(int arr[], int length)
正确方式
1.数组指针作为函数参数
void printArray(int(*arr)[8]) {
for (auto i : *arr){
std::cout << i << std::endl;
}
}
// 二维数组
void printArray(int(*arr)[2][3]) {
for(auto& i : *arr) { // must be reference here
for(auto j : i) {
std::cout << j << std::endl;
}
}
}
int main(int argc, const char *argv[])
{
int a[8] = {1,2,3,4,5,6,7,8};
int b[2][3] = {{11,22,33}, {44,55,66}};
printArray(&a);
printArray(&b);
return 0;
}
2.数组引用作为函数参数
void printArray(int(&arr)[8]) {
for (auto i : arr){
std::cout << i << std::endl;
}
}
// 二维数组
void printArray(int(&arr)[2][3]) {
for(auto& i : arr) { // must be reference here
for(auto j : i) {
std::cout << j << std::endl;
}
}
}
int main(int argc, const char *argv[])
{
int a[8] = {1,2,3,4,5,6,7,8};
int b[2][3] = {{11,22,33}, {44,55,66}};
printArray(a);
printArray(b);
return 0;
}
3.搭配模板使用
// 编译期获得数组长度
// see <<Effective Modern C++>>
template<typename T, std::size_t N>
constexpr std::size_t arraySize(T(&)[N]) noexcept {
return N;
}
// 打印任意长度一维数组,type T is printable
template<typename T, std::size_t N>
void printArray(T(&arr)[N]) noexcept {
for (auto& i : arr){
std::cout << i << std::endl;
}
}