
(1)2次元配列の動的確保について
1次元配列の動的確保は理解できたのですが、次のプログラムの
文(ⅰ)~(ⅱ)の意味を理解できていないので教えてください。
int **a, j, k, nrows=3, ncolumns=4 ;
a = (int **)malloc(nrows * sizeof(int *));
a[0] = (int *)malloc(nrows * ncolumns * sizeof(int)); …(ⅰ)
//先頭アドレスに…
for(j = 1; j < nrows; j++)
a[j] = a[0] + j * ncolumns; …(ⅱ)
//この行が特にわかりません。
(2)配列の添え字について
この書き方はどういう意味になりますか?
out[X_SIZE * (i) + (j)]
分かる方、回答お願いします。
No.2ベストアンサー
- 回答日時:
(1)について
二次元配列のように見えて、実のところポインタの1次元配列を使って2次元配列のようにソース上で書き表す方法と思われます。
a = (int **)malloc(nrows * sizeof(int *))で、
intのポインタを入れる領域を行の分(3つ)準備し、その領域の先頭ポインタを a に入れます。
これで
int *a[3];
としたのと同じものができました。
次に
(int *)malloc(nrows * ncolumns * sizeof(int)) で、
[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9][10][11]
の様に int の領域を取ります。
これは1次元配列と同じなのですが、
[ 0][ 1][ 2][ 3]
[ 4][ 5][ 6][ 7]
[ 8][ 9][10][11]
の様に2次元配列に見立てて、
for(j = 1; j < nrows; j++)
a[j] = a[0] + j * ncolumns; …()
で0,4,8を指すポインタをa[0],a[1]、a[2]に入れます。
(a[0]はすでに入っていますけどね)
すると、
a[1][2]で[6]の場所を、
a[0][3]で[3]の場所を指すことができます。
なぜこうなるのかはK&Rにバッチリ書いてあるので、調べてください。
必要であれば、明日追加の解説を書きます。
(2)について
1次元配列を2次元配列のように使う書き方です。
out[n][X_SIZE];
の様に宣言した配列を、
out[i][j]のようにアクセスするのと同じ効果があります。
もちろん、i<n,j<X_SIZEの範囲です。
これを応用すると、1次元配列を何次元のものにも見立てることができます。
その逆も可能です。
No.3
- 回答日時:
ちょっと間違えました。
該当部分を以下のように差し替えてください。
-------ここから下全部--------
次に
malloc(nrows * ncolumns * sizeof(int)) で、
[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9][10][11]
の様に int の領域を取ります。
これは1次元配列と同じなのですが、
[ 0][ 1][ 2][ 3]
[ 4][ 5][ 6][ 7]
[ 8][ 9][10][11]
の様に2次元配列に見立てて、
a[0]=(int *)malloc(nrows * ncolumns * sizeof(int))
for(j = 1; j < nrows; j++)
a[j] = a[0] + j * ncolumns;
で0,4,8を指すポインタをa[0],a[1]、a[2]に入れます。
No.1
- 回答日時:
まず、(i)の上にある行で、行数(=3)分のポインタ領域を指す
ポインタ a の領域を確保します。
次に(i)で、int型3行4列分全体の領域を指すポインタを a[0] に
格納します。イメージとしては、縦方向に3個、横方向に4個、
計12個の長方形を思い浮かべるとよいでしょう。
行番号、列番号とも、ここではゼロ始まりです。
つまり、0行0列~2行3列の12個です。
次のforループでは、1行目と2行目分の領域を指すポインタである
a[1] と a[2] を設定しています。
a[1] は a[0] から横方向の数である4個分だけ
ずれることになりますので、j(このときは1) * ncolums(=4) を加えています。
a[2] は a[1] からさらに4個分だけずれます。
a[0] からは8個分ずれますので、j(このときは2) * ncolumns を加えています。
out[X_SIZE * i + j]
は、out[X_SIZE]を基点として、i行j列分だけ離れた領域のことです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
C言語 ファイルの指定された行...
-
C言語において、 配列要素をひ...
-
C言語から質問です。
-
char型配列をint型に代入するには
-
背景差分法における正規化距離
-
C言語の課題が出たのですが自力...
-
MFC - ダイアログボックスのPic...
-
C#で構造体の配列を持った構造...
-
コンボボックスでデフォルト値...
-
define で 配列
-
ファイルのデータを構造体に代...
-
10人分の生徒の英語の点数{32,3...
-
関数への構造体の配列の渡し方<...
-
2番目の最大値を求める
-
MFCのCArrayを使った二次元配列
-
c言語
-
eの計算
-
この変数名はわかりにくいですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語 ファイルの指定された行...
-
C言語において、 配列要素をひ...
-
C言語の課題が出たのですが自力...
-
C#で配列が空かを判定するには?
-
構造体のextern方法
-
C言語の配列のコピーについて
-
c言語 構造体
-
C言語 数値の連続入力について
-
MFC - ダイアログボックスのPic...
-
C++DLLからC#へのコールバック...
-
配列のアドレス部
-
要素数・要素の値が未定の配列...
-
C言語についてです 5人のテスト...
-
.NET C++で、構造体の配列をnew...
-
2番目の最大値を求める
おすすめ情報