2

ポインタ配列に関する基本的な質問があります。

int *Arr[8]; // An array of int pointers

int (*Arr)[8]; // A pointer pointing to an int array

2 番目のものを使用する場合、配列に整数を割り当てるにはどうすればよいですか? ヒープ上にあるかどうかはわかっています

int *Arr = new int[8]

私はただすることができますArr[5] = 99。ステークでこれを行うにはどうすればよいですか?

ご助力ありがとうございます。

4

2 に答える 2

7

この宣言を考えると:

int (*Arr)[8];

intサイズ 8 の配列のアドレスを割り当てることができます。

int data[8];
Arr = &data;

次の方法で変更できdataますArr

(*Arr)[i] = value;

を囲む括弧に注意してください*Arr。インデックス演算子の優先順位が高いため、インデックスを適用するArr に逆参照する必要があります。[]

ここで理解しておくべき重要なことdataは、動的に割り当てられないことです。スコープ外になった後もそのアドレスを保持すると、ダングリング ポインター (存在しないものを指すポインター) が得られます。

配列を動的に割り当てて に割り当てるには、次Arrのように の結果に対して型キャストを使用できます。new

int (*Arr)[8] = reinterpret_cast<int(*)[8]>(new int[8]);

(実例はideoneにあります。)

もちろん、このような回りくどい方法でこれを行うことはあまり意味がありません。代わりに次のようにすることができます。

int* Arr = new int[8];

もちろん、代わりにstd::vectorを使用して、手動のメモリ管理を完全に回避できます。

std::vector<int> Arr;

これにより、必要に応じて独自に成長する配列が提供されます。

于 2013-07-27T20:41:48.753 に答える
2

std::arrayC++ を使用しているのに、 のようなコンテナーが適用できない理由はありますか? 例えば:

std::array<int, 8> arr;
std::array<int, 8>* arr_p = &arr;

実行時までサイズがわからない場合は、次を使用できますstd::vector

std::vector<int> vec(8);

あなたが持っているコードは正しいですが、標準ライブラリが利用可能であることを考えると、特に例外が関係している場合、バグやメモリリークが発生しやすいメモリを自分で手動で管理するのではなく、コンテナとアルゴリズムを使用することをお勧めします。

于 2013-07-27T20:41:45.933 に答える