int a = 10;
int *p = &a;
*p = 20; /* Is this a valid statement? */
int *p;
にメモリを割り当てていないので、そうすると*p = 10
無効になることを理解していp
ます。しかし、あるアドレスへのポインタを初期化すると、そのポインタにメモリが割り当てられるかどうか疑問に思いました。
int a = 10;
int *p = &a;
*p = 20; /* Is this a valid statement? */
int *p;
にメモリを割り当てていないので、そうすると*p = 10
無効になることを理解していp
ます。しかし、あるアドレスへのポインタを初期化すると、そのポインタにメモリが割り当てられるかどうか疑問に思いました。
あるアドレスへのポインタを初期化すると、そのアドレスにメモリが割り当てられるかどうか疑問に思いましたか?
メモリは割り当てられません。ポイントはすでに割り当てられているメモリを指してp
いるため
int a = 10; // a is statically allocated and value 10 is assigned.
int *p = &a; // p is pointed to address of a.
*p = 20; // at this point p points to that statically allocated memory
int a = 10;
int *p = &a;
*p = 20; /* Is this a valid statement? */
答えはYES
この特定の場合です。
しかし、あなたがこれを好きなとき:
int *ptr; //declaration of pointer variable
*ptr = 20; // It means you are assigning value 20 to the variable where `ptr` points to.
しかし、実際にptr
はどこも指していない、基本的にはそれが持っていることを意味しますindeterminate value
。
そうする*ptr = 20
ことで、が指すメモリアドレスに値20が割り当てられptr
ます。だからそれは呼ばれるUndefined bahavior
あなたの場合、それ&a
は有効なメモリ位置であり、p
実行するとその変数を指し始めたので有効ですp= &a
。
つまり、ポインタ*p = 20
を使用する値を実際に変更または割り当てることを意味します。a
p
int a = 10;
int *p = &a;
あるアドレスへのポインタを初期化すると、そのポインタにメモリが割り当てられるかどうか疑問に思いましたか?
いいえ。変数a
とp
変数はスタックに割り当てる必要があります。または、関数の外部にある場合は、グローバル変数としてメモリが割り当てられます。コンパイラは、これを自動的に実行します。
int a;
int* p;
...= <expression>
初期値を指定するためのなし。基本的に、メモリ内のあるアドレスでは、識別している値を格納するためにいくつかのバイト(4または8など)が予約されa
、別のアドレスでは、さらにメモリ(4または8バイトなど)が予約されます。呼び出す値を格納しますp
。
p
withの初期化は、の数値アドレスをメモリに&a
コピーするだけです...それは[1]の割り当てを引き起こさず、それらのメモリを移動しません。a
p
いくつかの作り上げられたアドレスを使用して、このように視覚化すると役立つ場合があります...
MEMORY-ADDRESS CONTENTS NAME
1000 10 a
2000 1000 p
ここで、p
「を指す」のは、のメモリa
の内容がのアドレスp
を保持しているためa
です。ただし、およびのアドレスはa
、p
初期化やその他の値の変更に関係なく、コンパイラによって選択されます。
ここであなたを混乱させているのは、ポインタを使用するときにメモリを割り当てることが多いということです...次のようなものです。
p = new int;
int
これは、実行時に動的にメモリを見つけ、そのメモリのアドレスをにロードしp
て、それを参照し、値p
を格納するために使用できるようにすることint
です。使い終わったらdelete p
、メモリをシステムに戻すことができます。これにより、メモリをリサイクルして、別のメモリが完了したときに使用できるようになりますnew
。このタイプの割り当ては、コード(または呼び出すライブラリ関数のコード)で明示的に実行する必要があります。
[1]-オプティマイザーは、実際のメモリを割り当てないこと、a
および/またはp
-代わりにCPUレジスタを使用することを選択できますが、プログラムの機能動作には影響しません(パフォーマンスに影響する可能性があります)。
ポインタは単なる数字です。正しい範囲の数値を表し、プログラムの理解を助けるために特別なタイプがありますが、基本的には単なる数値です。
番号はメモリアドレスを表します。それらを単純に補うことはできません。どこかから意味のあるアドレスを取得する必要があります。
あなたはできる:
p = &a
; またp = malloc(size)
これで、メモリのアドレスを取得したら、完了です。これで、演算子を使用して、好きな場所でポインターを逆参照できます。*
*p = somedata
いいえ、メモリは割り当てられません。p
と同じ場所を実際に指し、&a
で同じメモリを変更します*p = 20;
。割り当てられたメモリ(の)を参照しているため、これはクラッシュしませんa
。それがあなたが本当に欲しいものであるかどうかはあなただけに依存します。
しかし、あるアドレスへのポインタを初期化すると、そのアドレスにメモリが割り当てられるかどうか疑問に思いました。
「メモリを割り当てる」とはどういう意味ですか?ポインタを作成するときは、そのメモリ、つまり、ポインタが存在し続けるために必要なメモリを(静的に)割り当てます。
それとは別に、ポインタが指すメモリがあります。int a = 10
あなたがintを作成し、それを含むのに十分な大きさのメモリ空間を割り当てていると言うとき。
その場合、p = &a
「私のポインタは、格納されているメモリアドレスを指している必要があります」という意味ですa
。明らかに、すでに割り当てられa
ているので、安全に使用できます*p
が、一般的にこれは正しくなく、初期化されていないポインタが不正なアドレスを指している可能性があります。
いいえ、必要ありません。a
ポインタが変数のアドレスを指しているからです。したがって、を使用する*p = 20
と、の値a
が変わります。
だから、あなたの質問の答えはですYES
。:)