2016-12-22 22 views
0

は、以下のコードを考えてみましょう:C/C++のポインタ

int x[] ={10,20,30,40,50}; 
int *p; 
int **q; 

p = x; /* Obviously p now holds base address of array. So no problem here */ 
q = &x; /* Error. Why? */ 

私はgccのコンパイラでこのエラーを取得しています。

error: cannot convert ‘int (*)[5]’ to ‘int**’ in assignment q = &x; 

配列変数は、配列の最初の要素への定数ポインタと考えることができます。次に、定数ポインタのアドレス、すなわち& xをポインタ変数qのポインタに割り当てることができないのはなぜですか?

+1

'&X 'ので、[5]'、 'ないint型**' 'int型(*)型である - エラーメッセージが言うだけのよう。あなたはスペルから見ることができるように、それらはかなり異なるタイプです。ポインタの配列として値を扱うと、ポインタの配列ではないので、恐ろしい問題が発生します。 –

+0

@ JonathanLefflerしかし、コンパイラは 'int []'から 'int *'への代入を許可しています。違いは何ですか? – lxop

+1

私は何度も繰り返し言います:配列はポインタではなく、ポインタは配列ではありません。 cc @lxop –

答えて

2

配列は、割り当てなどの特定のコンテキストでポインタに崩壊するか、関数に渡します。

アドレス演算子&は、配列をポインタに崩壊させません。それはそれと同じくらい簡単です。代わりに、配列へのポインタを取得します。この場合:

int (*q)[5]; 

q= &x; // Works just fine 
+0

配列内の40と30の値をインクリメントするには 'q [0] [3] = 41;'または '(* q)[2] = 31; 'を使うことができます'q [0] [1] ++'はうまく動作し、インクリメントされていますが、正式なインクリメントはありません。 –