私は配列を渡す必要がある関数を持っています。サブアレイを関数に渡す
しかし、私はアレイ全体(array [0]からarray [size-1]までの有効なインデックス)を渡すのではなく、サブアレー(array [5] [サイズ-1])。
C++でこれを行う方法はありますか?
私は配列を渡す必要がある関数を持っています。サブアレイを関数に渡す
しかし、私はアレイ全体(array [0]からarray [size-1]までの有効なインデックス)を渡すのではなく、サブアレー(array [5] [サイズ-1])。
C++でこれを行う方法はありますか?
あなたはまた、配列の特定の範囲を転送することができ
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;
}
あなたは、関数に配列を渡すことはできません。しようとすると、実際に配列の最初の要素のアドレスを渡します。 5から始まる部分配列が必要な場合は、5番目の要素のアドレスを渡すだけです。とにかくCスタイルの配列を使うべきではありません。 std :: vectorとiteratorsを使用します。これはC++の方法です。
示されているように、配列の基本ポインタにオフセットを追加できます(それに応じて、渡された配列のサイズを引きます)。
"イテレータースタイル"の実装を実現するために、配列のポインタをbegin
と(最後を1つ後に)ポインターを関数に渡します。
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
1クラシックC++配列は 'サブアレイ' の概念がなかったです。 2.コストは変わらず、配列はポインタで渡され、配列と2つのインデックスを渡すことができます。 –
または、最初の要素にポインタを、最後の要素の後にポインタを渡すことで、イテレータの概念を使用できます。 – KIIV
配列を関数に渡すことはできません。しようとすると、実際に配列の最初の要素のアドレスを渡します。 5から始まる部分配列が必要な場合は、5番目の要素のアドレスを渡すだけです。とにかくCスタイルの配列を使うべきではありません。 std :: vectorとiteratorsを使用します。これはC++の方法です。 –