C統合・質問スレッドat TECH
C統合・質問スレッド - 暇つぶし2ch178:177
04/05/29 20:42
>>160が理解していないと思われることを補足しておく。
必要がなかったらスルーしてくれ。

まず、二次元配列は、配列の配列である。つまり、
int arr[2][3];
という宣言があるとき、arr[0]やarr[1]はintの配列で、要素数は3である。
ここで、配列はその先頭要素へのポインタに変換されることを思い出して欲しい。
だから、arrはarr[0]へのポインタに変換される。arr[0]はintの配列だから、
変換された後のarrはintの配列へのポインタ、つまり型はint (*)[3]である。
int (*)[3]型の変数pを宣言するにはint (*p)[3];と書く。これが、>>174
ptr = a;
が正しくコンパイルされる理由だ。

次に、配列の要素を指しているポインタに整数nを足すと、
はじめに指していた要素のn個先の要素を指すポインタができる。
これは、その配列が、配列への配列(二次元配列)であっても同じことである。
だから、>>174の例で*(ptr+(1*2)+1)と書くと、ptrの三番目の要素が得られる。
実際にはptrには二つの要素しかないから、この結果は意味を成さない。

最後に、配列はメモリ上で、各要素が隙間なく並べられる。たとえば、
int arr[2][3];
と宣言した場合、arr[0]とarr[1]が隙間なく並べられる。
このとき、arr[0]やarr[1]も配列だから、これらの各要素も隙間なく並べられる。結果的に、
arr[0][0] arr[0][1] arr[0][2] arr[1][0] arr[1][1] arr[1][2]
と並ぶことになる。
この並びを一次元配列とみなしてアクセスするのが、>>161の方法である。
このとき、一次元配列の各要素はintであることに注意してくれ。
これを実現するには、添え字を一次元配列用に計算してarr[0][0]へのポインタに足せば良い。
arrはarr[0]へのポインタであってarr[0][0]へのポインタではないから、そのままでは使えない。
そこで、素直に&arr[0][0]と書くか、(int *)arrと強引にキャストする。


次ページ
続きを表示
1を表示
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch