3

だから私は次のコードスニペットを持っています:

#include <stdio.h>

void pointer_shift(int *a, int n);

int main(void) {
    int a[] = {100, 101, 102};
    pointer_shift(a1, 3);
}

void pointer_shift(int *a, int n) {
    int i;
    for (i = 0; i != n - 1; i++) {
        *(a + i) = *(a + i + 1);
    }
}

このスニペットでポインターがどのように機能するかを明確にしたいだけです。つまり、pointer_shift はint へのポインタである 'a' を受け取りますよね?a1 はこのパラメーターに渡され、配列は最初の要素へのポインターに減衰するため、機能します。

まず、上記の段落で述べたことが正しいことを願っています。第二に、 *(a + i) = *(a + i + 1); は何をしますか? 実際に?for ループの最初の繰り返しで、i = 0 だとします。次に、左側の *a は何にアクセスしますか? それはポインタを表していますか?* は逆参照演算子だと思い、ポインタが指すオブジェクトにアクセスします...そして、*a = *(a + 1) を設定します。(a + 1) は配列の次の要素ですが、この代入は正確には何をし、その理由は何ですか?

ありがとう!

4

4 に答える 4

2

実際にはポインターシフトではなく、値シフトで*(a+i)あり、 と同じ効果がa[i]あるため、その動作は次のとおりです。a[i] = a[i+1]

于 2012-09-09T23:33:48.140 に答える
0

*(a + i) = *(a + i + 1);少しのポインター演算を使用して、配列内の配列要素をコピーしています。

*(a + i)は と同等なa[i]ので、ステートメントは と同等a[i] = a[i + 1];です。ループは、配列内の配列値を「左に」移動しています:a[0] = a[1]; a[1] = a[2];など。

関数呼び出しの理解は正しいです。

于 2012-09-09T23:31:54.477 に答える
0

このスニペットでポインターがどのように機能するかを明確にしたいだけです。つまり、pointer_shift は int へのポインタである 'a' を受け取りますよね?a1 はこのパラメーターに渡され、配列は最初の要素へのポインターに減衰するため、機能します。

はい、配列を関数に渡すと、ポインターに分解されます。配列は、オブジェクトの意味ではポインターではありませんが、値の意味ではポインターです。関数に渡すと、その値が渡されます。つまり、最初の要素へのポインターです。

配列のインデックス付けはポインター演算と同じであるため、このスニペットの最後の 2 行は同等です。

int arr[] = {1, 2, 3};

arr[0] = 10;
*arr = 10;

これらは次のとおりです。

arr[1] = 20;
*(arr + 1) = 20;
于 2012-09-09T23:32:41.280 に答える
0

この式はポインタ演算であり、 に格納されa + iているメモリ アドレスを のポインタ サイズの単位でインクリメントします。したがって、システムで へのポインタが 4 バイトを必要とし、現在のメモリ アドレスが である場合、の値は.aiaint0x1234a + 10x1238

アスタリスクが行うことは、そのアドレスを逆参照し、そのアドレスの実際の値にアクセスすることです。またはに保存し、 または に100保存aした場合、をat , for に置き換えます。a[0]101a + 1a[1]*(a + i) = *(a + i + 1)100101a[0]i = 0

基本的に、ポインターと配列に関するこの C チュートリアルを読みたいと思います。

于 2012-09-09T23:40:12.173 に答える