3

Cでのポインターの使用に関して、私は驚くべき疑問を抱いています。そのため、これについて多くのことを検索しましたが、満足のいく答えは提示されませんでした。これが事です:

INT 型のポインターと INT 型の変数 (int x、*pointer など) を宣言します。したがって、両方がそれぞれ 0x102 と 0x106 のように、RAM 内の連続したアドレスを占有しているとします。これまでのところ驚くことはありません。次に、x = 5 を宣言します。私のメモリ マップは次のようになるはずです。

int x, *pointer;
x = 5;

ポインター1

Ok。大学では、この方法でポインターを割り当てることを学びました。

pointer = &x;

そして、私のメモリマップは次のようになります。

ポインター2

ここまでは順調ですね。しかし、問題は、上記の代わりに、次のようなポインターを割り当てる場合です。

*pointer = x;

「x」のメモリアドレスは、ポインタのメモリアドレスに格納されるべきではありませんか? 「メモリマップ 2」のようなものをずっと考えていたのですが、結果は「メモリマップ 1」と同じで、0x106 アドレスにガベージ番号が格納されています。では、「x」のメモリアドレスがポインタのメモリアドレスに格納されていない場合、プログラムはどのように私が指し示したい場所を知っているのでしょうか? この情報はどこに保存されますか?

単純な質問のように見えますが、私には理解できません。:(

前もって感謝します!:)

4

4 に答える 4

7

ポインターがどのように機能するかを理解するのは難しいです。ここに役立つかもしれないものがあります。

あなたが書いた

int x, *pointer;

これは単なる慣用​​句ではありません。これは重要なことを伝えています。式x整数を保持できる変数であることを示しています。それはうまくいけば明らかです。また、式*pointer整数を保持できる変数であることも示しています。

あなたが言う時

x = 123;

つまり、「値123を変数に格納する」ということxです。

そして、あなたが言うとき

*pointer = 456;

つまり、「値456を変数に格納する」ということ*pointerです。

あなたが言う時

pointer = &x;

つまり、「*pointer整数を保持できる変数であることを覚えている式は、x」と同じ変数です。これらはエイリアスです。同じ変数の 2 つの名前です。

だからあなたの質問は:

xのメモリアドレスがポインタのメモリアドレスに格納されていない場合、プログラムはどこを指し示すかをどのように認識しますか?

私が確立した用語を使用して、その質問を言い換えてみましょう。

初期化しない場合、どの変数が 参照されているかをプログラムはどのように認識しますか?*pointerpointer

それはわからない。 あなたが言うなら:

int x;
printf("%d", x);

次に、任意の整数を出力できます。これは未定義の動作です。変数にどのような値を持たせたいかを言っていないxので、任意の値を持つことができます。あなたが言う時:

int *pointer;
*pointer = 123;

123次に、「変数に格納」と言っ*pointerていますが、変数が何であるかを言っていません*pointerxしたがって、任意の値を持つことができるのと同じように、任意の変数*pointerにすることができます。繰り返しますが、未定義の動作があります。

それはもう明らかですか?

于 2013-05-11T15:18:46.490 に答える
4
int x, *pointer;
*pointer = x;

pointerは有効なメモリ位置を指していないため、これは未定義の動作です。

int x, *pointer;
x = 5;
pointer = &x;
*pointer = x;

この最後の行は、;を指してx = xいるため、基本的に と同じです。pointerx

于 2013-05-11T15:04:06.250 に答える
3

*は逆参照演算子であるため、次のことを試みます。

  • の値を保存します (その名前の前にxaddressof, 演算子がないため)&

  • あなたのポインタがまだ初期化されていないので、これは不確定です pointer

これは のアドレスを格納していませxpointer。あなたが望むことは、単に書くことによって達成されpointer = &x;ます.それ以外のことは何もしません. ちなみに、初期化されていないポインタが指すメモリへの割り当てにより、未定義の動作*pointer = xが呼び出されます。

于 2013-05-11T15:02:44.213 に答える
2

やっている

*somePtr = someVar

somevar.が指す場所にの値を代入しsomePtrます。

より包括的にするために、

int x = 2, y =3;
int * pointer;
pointer = &x;
*pointer = y;

yinの値を割り当てますx。それでおしまい!

于 2013-05-11T15:02:48.947 に答える