1

次のコードがあるとします。

int x = 100;
int* p = &x;
*p = 20;
print(x);    //<= reaching defitition of x?

実行すると20が出力されます。問題は、最初の割り当てまたはポインター割り当ての
どのステートメントが到達定義であるかです。print(x)

また、次のコードで:

void sub(int* p)
{
    *p = 20;
}

int x = 100;
sub(&x);
print(x);    //<= reaching defitition of x?

同じ問題が存在します。定義分析に到達する特殊なケースですか、それともそれを処理するために特別なアルゴリズムが必要ですか?

4

2 に答える 2

0

ポインタがどのように機能するかをもっと理解する必要があります。1 台のテレビと 2 台のリモコンがあるとします。最初の例では、変数 x (リモコン) は値 (100) とアドレス (TV) を持っています。ここで、x と同じアドレス (同じ TV に対する 2 番目のリモコン) を指すポインター *p が来ます。*p の値 (TV チャンネル) を変更すると、それに応じて x の値が変更されることが期待されます。したがって、*p と x の両方が値 20 (同じ TV チャンネル) と同じアドレス (同じ TV の 2 つのリモコン) を保持します。

もう少し明確になることを願っています

于 2012-07-07T14:02:51.057 に答える
0

定義に到達することを正しく理解したかどうかはわかりませんが、次のようになります。

最初のサンプルでは、​​値を*p = 20に割り当てるため、到達定義は です。20x

2 番目のサンプルでは、​​値をに割り当てるため、到達定義が再び*p = 20になります。sub()20x

pのアドレスを含み、保持するアドレスに格納されている値xを変更します。*p =p

于 2012-07-07T14:04:25.893 に答える