2017-08-15 16 views
0

ポインタはどのように配列で動作しますか?私はシンタックスを少し謎に思っています(例:16x1):ポインタ(ポインタ)と新しい/ mallocベクトル(ベクトルの内側)C++

int* a = new int[16]; 
a[16] = 33; 
cout << a[16] << endl; 

上記の例が機能します。通常、*値を書き込む/読み込むためのポインタの前にある必要がありますが、ベクトルではありません。

場合は、私が作成するには、次の方法を見つけた多次元配列、(16x3)のために、より複雑である:

int** a = (int**)new int[16]; 
for (int i = 0; i < 16; i++) 
{ 
    a[i] = (int*)new int[3]; 
} 
a[15][2] = 4; 
cout << a[15][2] << endl; 
再び

、上記の作品が、それは構文は、ポインタとどのように関係するかを把握するのは難しいです。構文はmallocでも有効です。 mallocには、多次元配列を自動的に初期化するオプション "memset"があります(forループに入れてください)。新しい同様のオプションがありますか?

+6

「int」要素の「配列」を割り当てた後、要素番号17に書き込みますか?これは範囲外であり、*未定義の動作*につながります。 –

+0

"上記の例は、" - ':/ s/works/invoked-undefined-behavior/g'を実行します。 – WhozCraig

+0

私はポインタ配列と' malloc'に慣れていませんが、 'a [16]'最初の例では? – kim366

答えて

3

通常、*値を書き込む/読み込むにはポインタが必要ですが、ベクトルでは読み込まれません。

ポインターの値を取得するには、常に参照を逆参照する必要があります。添え字演算子は逆参照するもう一つの方法です。 a[b]は、*(a+b)に相当します(aは、添え字演算子がオーバーロードされたクラスでない限り)。


int** a = (int**)new int[16]; 

これはバグです。 intの配列を割り当てましたが、最初の要素がint*であるかのようにポイントしてください。ポインタの配列が必要な場合は、new-expressionに正しい型(int*)を指定する必要があります。このようなバグを避ける方法は、戻り値newを絶対にキャストしないことです。コンパイラは間違いを犯すとあなたに知らせます。

ここでも、上記の作品

動作は未定義です。

mallocには、多次元配列(forループに入れる)を自動的に初期化するオプション "memset"があります。新しい同様のオプションがありますか?

memsetもC++標準ライブラリにありますが、初期化には必要ありません。より簡単なのは、値の初期化を使用することです。

int** a = new int*[16](); 
//     ^syntax for value initialization 

P.S.:また正しい型と鋳造の欠如に注意してください割り当てたメモリの割り当てを解除しません。したがって、メモリがリークします。

P.P.Sポイントポインターを裸のポインタで動的オブジェクトに格納するのは悪い考えです。 std::vectorのようなRAIIコンテナを使用する方が良いです。

+0

[b] [c]の意味はなんですか? – Dole

+1

@Dole添字演算子は左結合であるため、明示的逆参照形式にステップごとに左から右へ変換することができます。 'a [b] [c]' == '(*(a + b))[ c] '==' *(*(a + b)+ c) ' – user2079303

1

この構文は、演算子[](オフセット演算子)は演算子*と同じ働きをしますが、ポインタをある量だけインクリメントするため機能します。だからa[5]*(a+5)とまったく同じです。

もう少し詳しく知りたい場合は、article about pointerをチェックして、このオペレータに言及し、より技術的な説明を提供することをお勧めします。

関連する問題