2017-04-09 14 views
0

私は動的に割り当てられた1D配列を持っていて、ダブルポインタ(** ptr)をポイントしてからptrを2D配列として扱いたいのですが、2D配列の幅を設定する必要がありますこれを行う方法はありますか?例えば、私が8×10の2D配列として扱う次元80の配列を持っているとすると、((ptr)+1)は10単位移動します。私は手動でそれをarr [i row + j]として使用できることを知っていますが、私はそれを他の方法で行うことを好むでしょう。ご協力いただきありがとうございます!!!ポインタを使用して二次元アレイとして一次元アレイを再解釈するcでポインタの幅を設定する方法は?

+1

'a [80]と入力します。型(* b)[10] =(型(*)[10])a; 'b [i] [j]'を使う。 – BLUEPIXY

+0

10をcolなどの変数に置き換えることはできますか? (回答btwのおかげで)。 –

+2

この問題では、 '幅'と '倍'という用語はあいまいです。 C言語の文脈では、通常はここで意図したのとは異なる意味を持つと理解されています。たぶん、あなたが意味することは疑問の中ではっきりしていますが、タイトル自体は誤解を招くものです。 – Clifford

答えて

3

Type a[80]; 
Type (*b)[10] = (Type (*)[10])a;//or simply (void*)a. b is pointer to Type[10] 

b[i][j]

注使用:(**ptrなどのような) ダブルポインタは基本的に間違いです。
一般に、配列はポインタの配列ではありません。

int col = 10; Type (*b)[col] = (Type (*)[col])a;また、C99以降のVLA(可変長配列)としても使用できます(c11のオプション)。

+0

[DEMO](http://ideone.com/w2Lrcm) – BLUEPIXY

1

TYPE**は、TYPE*オブジェクト以外を指すことはありません。 TYPE*オブジェクトはありません。 TYPEの配列は1ではありません。配列TYPEのに加えて、TYPE*の配列を割り当て、前者の各要素が後者の関連要素を指すように配置することができます。

TYPE* elements = malloc (N_rows * N_cols * sizeof(TYPE)); 
TYPE** rows = malloc (N_rows * sizeof(TYPE*)); 
for (i = 0; i < N_rows; ++i) 
    rows[i] = elements + N_cols * i; 

これはむしろ非効率的で不便です。あなたの次元の1つがコンパイル時定数であるか、またはVLAを使うことができる場合、二重逆参照なしでそれを行う方法があります(他の答えで詳しく説明しますので、私は繰り返しません)。

関連する問題