警告:これを行わないでください。これが、ベクトルがある理由です。
データの配列を作成し、関数から返す場合は、どのように行いますか?
明らかに、これは機能しません。
int [10] makeArray(int val)
{
int arr[10];
for(int i=0; i<10; ++i)
arr[i] = val;
return arr;
}
関数から配列を返すことはできません。次のように、ポインタを使用して配列の最初の要素を参照できます。
int * makeArray(int val)
{
int arr[10];
for(int i=0; i<10; ++i)
arr[i] = val;
return &(arr[0]); // Return the address of the first element.
// Not strictly necessary, but I don't want to confuse.
}
ただし、これも失敗します。arrはローカル変数であり、スタックに配置されます。関数が戻ると、データは無効になり、無効なデータを指すポインターが作成されます。
私たちがする必要があるのは、関数が終了した後も存続する配列を宣言することです。そのために、その配列を作成し、ポインタに格納する必要があるアドレスを返すキーワードnewを使用します。
int * makeArray(int val)
{
int * arr = new int[10];
for(int i=0; i<10; ++i)
arr[i] = val;
return arr;
}
次に、その関数を呼び出して、次のようにその配列を使用できます。
int * a = makeArray(7);
for(int i=0; i<10; ++i)
std::cout << a[i] << std::endl;
delete [] a; // never forget this. Obviously you wouldn't do it right
// away like this, but you need to do it sometime.
newでポインターを使用すると、実行時に配列のサイズを決定できるという利点もあります。これは、ローカルの静的配列では実行できません(Cでは実行できます)。
int * makeArray(int size, int val)
{
int * arr = new int[size];
for(int i=0; i<size; ++i)
arr[i] = val;
return arr;
}
これは、ポインタの主な目的の1つでした。しかし、冒頭で述べたように、私たちはもうそれをしません。を使用しますvector
。
ポインターの最後の痕跡の1つは、動的配列用ではありません。私がこれまでに使用したのは、あるオブジェクトが別のオブジェクトにアクセスできるようにし、そのオブジェクトの所有権を与えないクラスでのみです。したがって、オブジェクトAはオブジェクトBについて知る必要がありますが、オブジェクトAがなくなっても、オブジェクトBには影響しません。これに参照を使用することもできますが、オブジェクトAにどのオブジェクトを変更するオプションを与える必要がある場合は使用できません。にアクセスできます。