おそらく理解はできているのだが、実際に表示させてみる。
#include<stdio.h> int main(void){ int i; char array[10][10][10][10]; // arrayは「int(*)[10][10][10]」、&arrayは「int(*)[10][10][10][10]」、&array[0]はarrayと同様「int(*)[10][10][10]」を指している // arrayと&array[0]は同じものを指しているが、&arrayは配列全体へのポインタを指していることに注意 printf("***** 配列の先頭アドレスを表示する色々な方法 *****\n"); printf("array = %p, &array = %p, &array[0] = %p\n\n", array, &array, &array[0]); // sizeofの中では配列名は例外的にポインタに読み替えられない // しかし、&arrayや&array[0]はアドレス演算子を使っているのでポインタに読み替えられている printf("***** 配列っぽいものにsizeof演算子を適応した結果 *****\n"); printf("sizeof array = %d, sizeof &array = %d, sizeof &array[0] = %d\n\n", sizeof array, sizeof &array, sizeof &array[0]); // ここから本題の実験 printf("***** 一番右の添字をいじる *****\n"); for(i = 0; i < 10; i++){ printf("&array[0][0][0][%d] = %p\n", i, &array[0][0][0][i]); } printf("\n"); printf("***** 右から二番目の添字をいじる *****\n"); for(i = 0; i < 10; i++){ printf("&array[0][0][%d][0] = %p\n", i, &array[0][0][i][0]); } printf("\n"); printf("***** 左から二番目の添字をいじる *****\n"); for(i = 0; i < 10; i++){ printf("&array[0][%d][0][0] = %p\n", i, &array[0][i][0][0]); } printf("\n"); printf("***** 一番左の添字をいじる *****\n"); for(i = 0; i < 10; i++){ printf("&array[%d][0][0][0] = %p\n", i, &array[i][0][0][0]); } printf("\n"); return 0; }
実行結果は次のようになった。
***** 配列の先頭アドレスを表示する色々な方法 ***** array = 0xffd1568c, &array = 0xffd1568c, &array[0] = 0xffd1568c ***** 配列っぽいものにsizeof演算子を適応した結果 ***** sizeof array = 10000, sizeof &array = 4, sizeof &array[0] = 4 ***** 一番右の添字をいじる ***** &array[0][0][0][0] = 0xffd1568c &array[0][0][0][1] = 0xffd1568d &array[0][0][0][2] = 0xffd1568e &array[0][0][0][3] = 0xffd1568f &array[0][0][0][4] = 0xffd15690 &array[0][0][0][5] = 0xffd15691 &array[0][0][0][6] = 0xffd15692 &array[0][0][0][7] = 0xffd15693 &array[0][0][0][8] = 0xffd15694 &array[0][0][0][9] = 0xffd15695 ***** 右から二番目の添字をいじる ***** &array[0][0][0][0] = 0xffd1568c &array[0][0][1][0] = 0xffd15696 &array[0][0][2][0] = 0xffd156a0 &array[0][0][3][0] = 0xffd156aa &array[0][0][4][0] = 0xffd156b4 &array[0][0][5][0] = 0xffd156be &array[0][0][6][0] = 0xffd156c8 &array[0][0][7][0] = 0xffd156d2 &array[0][0][8][0] = 0xffd156dc &array[0][0][9][0] = 0xffd156e6 ***** 左から二番目の添字をいじる ***** &array[0][0][0][0] = 0xffd1568c &array[0][1][0][0] = 0xffd156f0 &array[0][2][0][0] = 0xffd15754 &array[0][3][0][0] = 0xffd157b8 &array[0][4][0][0] = 0xffd1581c &array[0][5][0][0] = 0xffd15880 &array[0][6][0][0] = 0xffd158e4 &array[0][7][0][0] = 0xffd15948 &array[0][8][0][0] = 0xffd159ac &array[0][9][0][0] = 0xffd15a10 ***** 一番左の添字をいじる ***** &array[0][0][0][0] = 0xffd1568c &array[1][0][0][0] = 0xffd15a74 &array[2][0][0][0] = 0xffd15e5c &array[3][0][0][0] = 0xffd16244 &array[4][0][0][0] = 0xffd1662c &array[5][0][0][0] = 0xffd16a14 &array[6][0][0][0] = 0xffd16dfc &array[7][0][0][0] = 0xffd171e4 &array[8][0][0][0] = 0xffd175cc &array[9][0][0][0] = 0xffd179b4