10.ポインタ

10-9. 二次元配列とポインタ

◇2次元配列とポインタ

まずは2次元配列をポインタを使ったようにアクセスしてみます。
注:ポインタは使っていません。

#include<stdio.h>
main()
{
    int matrix[2][3]={{1,2,3},{4,5,6}};

    printf("matrix[0][0] = %d\n",**matrix        );
    printf("matrix[0][1] = %d\n",*(*matrix+1)    );
    printf("matrix[0][2] = %d\n",*(*matrix+2)    );
    printf("matrix[1][0] = %d\n",**(matrix+1)    );
    printf("matrix[1][1] = %d\n",*(*(matrix+1)+1));
    printf("matrix[1][2] = %d\n",*(*(matrix+1)+2));

    printf(" &matrix[0][0] = %d\n",&matrix[0][0]);
    printf(" &matrix       = %d\n",&matrix);
    printf("  matrix       = %d\n",matrix);
    printf(" *matrix       = %d\n",*matrix);
    printf("**matrix       = %d\n",**matrix);

    printf("&matrix[0][0]+1 = %d\n",&matrix[0][0]+1);
    printf("&matrix+1       = %d\n",&matrix+1);
    printf(" matrix+1       = %d\n",matrix+1);
    printf("*matrix+1       = %d\n",*matrix+1);

}

/* 結果(注:今回に限ってアドレス値を10進数で表示しました)
matrix[0][0] = 1
matrix[0][1] = 2
matrix[0][2] = 3
matrix[1][0] = 4
matrix[1][1] = 5
matrix[1][2] = 6
 &matrix[0][0] = 6618604
 &matrix       = 6618604
  matrix       = 6618604
 *matrix       = 6618604
**matrix       = 1
&matrix[0][0]+1 = 6618608
&matrix+1       = 6618628
 matrix+1       = 6618616
*matrix+1       = 6618608
*/

配列の場合サンプルのようなポインタもどきが出来るのです。
&matrix:行列の先頭アドレス
matrix:最初の行の先頭アドレス
*matrix:最初の列の先頭アドレス
**matrix:要素の値

これだけでは結果として
&matrix=matrix=*matrix、で同じ値になります。
ただし+nとした時に増分するアドレスが変わります。

&matrix+1:表の終わりの次にあるアドレス(+24)
matrix+1:次の行のアドレス(+12)
*matrix+1:次の要素のアドレス(+4)

一度は図に書いてアドレスの対応を取ってみると理解しやすくなります。

それでは2次元配列をポインタでアクセスしてみましょう。

main()
{
    int matrix[2][3]={{1,2,3},{4,5,6}};
	int **point;
	point=matrix;
    printf("matrix[0][0] = %d\n",**point        );
    printf("matrix[0][1] = %d\n",*(*point+1)    );
    printf("matrix[0][2] = %d\n",*(*point+2)    );
    printf("matrix[1][0] = %d\n",**(point+1)    );
    printf("matrix[1][1] = %d\n",*(*(point+1)+1));
    printf("matrix[1][2] = %d\n",*(*(point+1)+2));
}

コンパイル時にポインタへの代入に警告が出てきて実行するとページ違反で強制終了しました。
なぜ、このようなことになったのでしょう。