は
*(ary[3]+8)
と
ary[3][8]
同じだ ?はいの場合、その方法を説明してください。ary[3] は、最初の要素のアドレスまたは ary[3][0] の値を返しますか? ary は 2 次元配列です。
前もって感謝します。
はい
a[i]
と同じです*(a+i)
ary[i][j]
と同じです*( *(ary+i)+j))
x
が配列である場合(int
など)x[i]
は、 の構文糖衣にすぎません*(x+i)
。あなたの場合、ary
は 2 次元配列です (再びint
、と言います)。同じシンタックス シュガー メカニズムにより、ary[i][j]
は と同等*((*(ary+i))+j)
であり、内部で何が起こっているかは明らかです。
*(ary[3]+8)
3 行目の 8 列目の値を示します。ary[3]
3行目のベースアドレスです。ary[3][8]
3 行目 8 列目の同じ要素にもアクセスします。
例として、8 要素の 1D 配列と同等の 2 行 4 列の 2D 配列を使用しています。以下に示すように。
int a[8] = {0,1,2,3,4,5,6,7};
int b[2][4] = {{0,1,2,3},{4,5,6,7}};
はb
2D 配列であるため、2 つの 1D 配列の配列と見なすことができます。b[1] または b[1][0] を渡すと、最初の行のアドレスが示されます。要素 a[row][col] のアドレスを見つけたい場合、次のように計算されます
address = baseAddress + elementSize * (row*(total number of column) + col);
他の人がすでに言ったように、a[i]
は単なる砂糖です*(a+i)
。
常に機能することを付け加えたいと思います。これにより、次のようなことができます。
char a[10];
char b;
char c[10][20];
// all of these are the same:
b = a[5]; // classic
b = *(a + 5); // pointer shifting
b = 5[a]; // even so!
b = c[5][9];
b = *(c[5] + 9);
b = *(*(c + 5) + 9);
b = *(c + 5)[9];
b = 5[c][9];
b = 5[9][c]; // WRONG! Compiling error