C で書かれたプログラムに出くわし、ポインタ比較プログラムを見ました。私が理解できなかったのは、これら2つのステートメントです。
j=&arr[4];
k=(arr+4);
最初のステートメントは 5 番目の要素のアドレスを保持しており、2 番目のステートメントの構文は初めて見たものです。誰かが私に2番目のステートメントを説明できますか. また、プログラムを実行した後も j と k は等しくなります。したがって、それらは同じ場所を指しています。
C で書かれたプログラムに出くわし、ポインタ比較プログラムを見ました。私が理解できなかったのは、これら2つのステートメントです。
j=&arr[4];
k=(arr+4);
最初のステートメントは 5 番目の要素のアドレスを保持しており、2 番目のステートメントの構文は初めて見たものです。誰かが私に2番目のステートメントを説明できますか. また、プログラムを実行した後も j と k は等しくなります。したがって、それらは同じ場所を指しています。
k =(arr + 4);
へのポインタに減衰された後、位置k
の4つ前の要素を指すことを意味します。arr
index 0
配列名は、ゼロインデックスへのポインタに減衰します。4を追加すると、5番目の要素を指すことになります。
これは単にポインタ演算であり、Cのインデックス付け<->ポインタ差分の同等性と混合されています。
前者は、式arr + 4
によってarr
(配列の名前)が単に配列の最初の引数へのポインターに減衰することを意味します。言い換えれば、arr == &arr[0]
本当です。
後者は、任意のポインタaと整数iについて、この同等性です。
a[i] === *(a + i)
これは、最初の式であるへの割り当てをj
として読み取ることができることを意味しますj = &(*(a + 4))
。これにより、行と同じように、インデックス4の要素のアドレスを取得していることが(かなり)明確になりますk
。
それは悪名高いポインター演算です! このステートメントは、 が指すアドレスに要素のアドレスを割り当て、arr
右に 4 つの要素のオフセットを割り当てるだけです。arr + 4
のアドレスを指していますarr[4]
。
このコードは、ポインター演算の単純なケースを使用しています。配列のアドレス(+4アドレス、つまり5番目の要素)をポインターkに割り当てます。
すべての arr[4] ステートメントは (arr+4) に費やされています。コンパイラ自体によるステートメント。
これら 2 つは同等であり、同じ意味で使用できます。
どちらもポインター値を取得する方法です。
最初arr[x]
に (x+1) 配列の内容を返し、& 演算子でそのアドレスを取得できます。Second はポインター演算として知られており、arr ポインターのアドレスに x 位置を加えたアドレス、つまり x+1 アドレスを返します。
これは基本的なポインター演算です。k はポインター、arr は配列の最初の要素へのポインター (arr[0] へのポインター) です。したがって、k に 4 を追加すると、ポインタが 4 つの要素に移動します。したがって、k=(arr+4) は、k が 5 番目の要素である arr[4] を指すことを意味し、j と同じです。