2

ポインター演算に関する試験の改訂問題がありますが、2 つの配列変数のアドレスを減算している部分が意味をなしていません。

1 つの配列は実際にはもう 1 つの配列と同じです。各配列変数の個々の出力を理解しています。この場合、この OS で int = 4 バイトを指定すると、2 つのアドレスの差は 16 になります。

私が理解していないのは、なぜ減算が4になるのかということです.私の論理では、配列内で4つの位置が離れているということですが、これは私には意味がありません.

int main(void)
{

int oddNums[5] = {1, 3, 5, 7, 9};
int *ip = oddNums;

printf("&oddNums[4] %d - ip %d= %d\n",&oddNums[4], ip,  &oddNums[4] - ip);
/*prints &oddNums[4] 2686740 - ip 2686724= 4*/

   return EXIT_SUCCESS;
}
4

2 に答える 2

3

ポインタ減算の定義は、2 つのポインタ間の要素数の差を与えることです。

これは、整数にポインターを追加するのと似ています。これは、ポインターをその要素数だけ進めることを意味します。

「ポインター」を、特定のタイプのオブジェクトを見つける場所を示すものとして考えていることを確認してください。(メモリアドレスを表す整数と考えるのではなく)。

于 2014-08-26T23:41:43.633 に答える
3

4の項で結果を返すため、減算が返されますsizeof(<array-element>)。これは、減算を加算の逆にするために行われます。これは、配列要素のサイズに関しても機能します。

aが配列でi整数の場合、a+iは と同じ&a[i]であるため、加算では要素のサイズを考慮する必要があることを思い出してください。数学のルールに従うために、減算は要素のサイズも除算する必要があります。

これにより、加算と減算の操作が配列要素のサイズを処理するため、ポインター演算がはるかに簡単になります。この規則がないと、目的の要素のアドレスを取得したり、オフセットを取得したりするために、加算または減算の結果を要素のサイズで除算または乗算し続ける必要があります。これはエラーが発生しやすく、読みにくいものでもあります。最後に、要素のサイズを 1 バイトから数バイトに変更し、アルゴリズムをコーディングした人が で乗算または除算するのを忘れた場合、これはメンテナンスの悪夢を引き起こしますsizeof

于 2014-08-26T23:42:30.840 に答える