如果只传递数组,不数组长度,如何利用函数来处理数组?
#include <iostream>
int sum(int arr[]); // how to implement
main()
{
int arr[5] = {1,2,3,4,5};
std::cout<<sum(arr);
getchar();
}
int sum(int arr[])
{
//
return 0;
}
一点前置知识:
对于一维数组:
int arr[5] = {1,2,3,4,5};
// 指向数组首元素的指针:
int *ape = arr; // arr退化为指向数组首元素的指针
// 指向数组整体的指针:
int (*ap)[5] = &arr;
对于二维数组:
int arr[3] [4]= {1,2,3,4,5,6,7,8,9,10,11,12};
// 指向数组首元素的指针:
int (*ape)[4] = arr; // arr退化为指向数组首元素的指针
// 指向数组整体的指针:
int (*ap)[3][4] = &arr;
很明显,对于指向数组首元素的指针和指向数组整体的指针,指针的目标类型是不同的。
对于指向数组首元素的指针,其数组元素的类型相对于数组类型来说,丧失了第一维的长度信息。
对于指向整体数组的指针而言,保留了第一维的长度信息。
不同类型的指针,当指针偏移(指针加减一个整型值)时,其偏移的字节数不同。
对于指向数组首元素的指针ape,ape+1表示偏移sizeof(int)*4*1个字节;
对于指向数组整体的指针ap,ap+1表示偏移sizeof(int*3*4*1个字节。
如果指定数组长度,代码很简单:
#include <iostream>
int sum(int arr[],int size); // 指向数组首元素的指针+元素长度
main()
{
int arr[5] = {1,2,3,4,5};
std::cout<<sum(arr,5);
getchar();
}
int sum(int arr[],int size)
{
int s=0;
for(int i=0;i<size;i++)
s += arr[i];
return s;
}
如何显式指定数组长度,并传递指向数组整体的指针,代码也很简单:
#include <iostream>
int sum(int (*arr)[5]); // 指向数组首元素的指针+元素长度
main()
{
int arr[5] = {1,2,3,4,5};
std::cout<<sum(&arr);
getchar();
}
int sum(int (*arr)[5])
{
int s=0;
for(int i=0;i<5;i++)
s += (*arr)[i];
return s;
}
可惜的是,这个函数只能处理数组长度为5的数组。
如何支持不同长度数组?
我们知道,模板在编译阶段展开,所以可以传递一个常量模板参数:
#include <iostream>
template<const int size>
int sum(int (*arr)[size]); // 指向数组首元素的指针+元素长度
int main()
{
int arr[5] = {1,2,3,4,5};
std::cout<<sum(&arr);
return 0;
}
template<const int size>
int sum(int (*arr)[size])
{
int s=0;
for(int i=0;i<size;i++)
s += (*arr)[i];
return s;
}
使用引用更简洁:
#include <iostream>
template<const int size>
int sum(int (&arr)[size]); // 指向数组首元素的指针+元素长度
main()
{
int arr[5] = {1,2,3,4,5};
std::cout<<sum(arr);
getchar();
}
template<const int size>
int sum(int (&arr)[size])
{
int s=0;
for(int i=0;i<size;i++)
s += arr[i];
return s;
}
for循环使用range for更简洁:
#include <iostream>
template<const int size>
int sum(int (&arr)[size]); // 指向数组首元素的指针+元素长度
main()
{
int arr[5] = {1,2,3,4,5};
std::cout<<sum(arr);
getchar();
}
template<const int size>
int sum(int (&arr)[size])
{
int s=0;
for(int i:arr)
s += arr[i];
return s;
}
-End-