将子阵列传递给函数

时间:2016-09-12 07:24:45

标签: c++ arrays

我有一个我需要传递数组的函数。

但我不想传递整个数组(例如,从数组[0]到数组[size-1]的有效索引),而是一个子数组(例如,从数组[5]开始到数组的有效索引[尺寸-1])。

有没有办法在C ++中做到这一点?

2 个答案:

答案 0 :(得分:0)

您可以将数组传输到下面的功能参数

void Foo(int* arr, int length);
//call Foo
Foo(&a[0], length); //or
Foo(a, length);

您也可以传输一定范围的数组。

Foo(&a[1], length);
Foo(a + 1, length);

只是简单的代码。

#include <iostream>
void Print(int* arr, int length)
{
    for(int i=0; i < length; i++)
    {
        std::cout << *(arr + i) << ", ";
    }

    std::cout << std::endl;
}

int main()
{
    int a[5] = {1,2,3,4,5};

    //type A
    Print(&a[0], sizeof(a)/sizeof(int)); //print all element of a
    Print(&a[1], 3); //print 2,3,4

    //type B
    Print(a, sizeof(a)/sizeof(int)); //print all element of a
    Print(a + 1, 3); //print 2,3,4

    getchar();
    return 0;
}

答案 1 :(得分:0)

Quoted comment by n.m.:

  

您无法将数组传递给函数。当你尝试时,你实际上传递了数组的第一个元素的地址。如果你需要一个从5开始的子数组,你只需要传递第五个元素的地址。不管怎么说,你不应该使用C风格的数组。使用std :: vector和迭代器,这是C ++方式。

如上所示,您可以向数组基指针添加偏移量(并相应地从传递的数组中减去)。

或者将beginend(一个结束时)指针传递给函数以实现“迭代器式”实现。

But as you are programming C++, please consider to use std::vector.

示例:

#include <iostream>

void foo(int arr[], int size) {
    for (int i = 0; i < size; i++)
        std::cout << arr[i] << ' ';
}

void bar(int* begin, int* end) {
    while (begin != end)
        std::cout << *begin++ << ' ';
}

int main() {
    int arr[] = {0,1,2,3,4,5,6,7,8,9};
    int size = sizeof(arr)/sizeof(*arr);

    // pass entire array
    foo(arr, size);
    //bar(arr, arr+size);
    std::cout << '\n';

    // pass array starting at index 5
    foo(arr+5, size-5);
    //bar(arr+5, arr+size);
    std::cout << '\n';
}

输出结果为:

$ g++ test.cc && ./a.out
0 1 2 3 4 5 6 7 8 9 
5 6 7 8 9