天天看点

C++|不传递数组长度,也可以利用函数传递数组指针处理数组

如果只传递数组,不数组长度,如何利用函数来处理数组?

#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-

继续阅读