我有一个我需要传递数组的函数。
但我不想传递整个数组(例如,从数组[0]到数组[size-1]的有效索引),而是一个子数组(例如,从数组[5]开始到数组的有效索引[尺寸-1])。
有没有办法在C ++中做到这一点?
答案 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)
您无法将数组传递给函数。当你尝试时,你实际上传递了数组的第一个元素的地址。如果你需要一个从5开始的子数组,你只需要传递第五个元素的地址。不管怎么说,你不应该使用C风格的数组。使用std :: vector和迭代器,这是C ++方式。
如上所示,您可以向数组基指针添加偏移量(并相应地从传递的数组中减去)。
或者将begin
和end
(一个结束时)指针传递给函数以实现“迭代器式”实现。
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