f1
を取得するにはa_struct
、内で編集できるようにするかどうかによって異なりますf1
。void f1(a_struct s);
正常に動作し、コピーを作成します。void f1(const a_struct & s);
参照を取りますが、それを変更することはできません(とにかく面倒なことなしに)。const
非参照を避けるようにしています。
f2
を取りたい場合はint
、と書きvoid f2(int);
ます。それがどこからint
来たのか(つまり、内部struct
またはそれ自体)は関係ありません。それからそれを次のように呼びますf2(point.b);
配列を受け取る関数は面倒な場合があり、それをどのように処理するかによって異なります。最も簡単な方法は、配列がポインターに縮退することを覚えておくことです。
void f3 (a_struct * const structArray)
{ /* Do something */ }
a_struct myArray[10];
f3(myArray);
これを行う他の(より良い)方法もあります。
編集:配列のすべての要素に関数を適用する場合は、(表面的には)2つのアプローチがあります(これについて考えると、実際には1つのアプローチにすぎません)。配列をループし、各要素をを受け取る関数にa_struct
渡すか、配列全体を(サイズパラメーターも使用して)渡し、関数内でループします。つまり、あなたはそうするでしょう:
a_struct myArray[10];
for (int i = 0; i < 10; ++i)
{
f1( myArray[i] );
}
// Or, better, from <algorithm>
std::for_each(myArray, myArray+10, f1);
これは範囲外のアクセスではないことに注意してください。逆参照されない限り、(これらのループ状況で正確に)配列の末尾から1つ離れたポインターを作成できることが保証されます。
もちろん、これはすべて、実際には配列ではなく配列が必要であることを前提としていますstd::vector
(この場合、ループは基本的に同じように見えますが、begin()
およびend()
メンバー関数を使用する場合を除きます)。
実際、にアクセスできる場合は、とc++11
を使用できます。これは、 sまたは配列に対してまったく同じように機能します。std::begin()
std::end()
vector