1
int a = 10;    
int *p = &a; 

*p = 20;  /* Is this a valid statement? */

int *p;にメモリを割り当てていないので、そうすると*p = 10無効になることを理解していpます。しかし、あるアドレスへのポインタを初期化すると、そのポインタにメモリが割り当てられるかどうか疑問に思いました。

4

7 に答える 7

6

あるアドレスへのポインタを初期化すると、そのアドレスにメモリが割り当てられるかどうか疑問に思いましたか?

メモリは割り当てられません。ポイントはすでに割り当てられているメモリを指して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
于 2012-12-04T11:02:46.097 に答える
5
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を使用する値を実際に変更または割り当てることを意味します。ap

于 2012-12-04T11:02:17.087 に答える
4
int a = 10;    
int *p = &a; 

あるアドレスへのポインタを初期化すると、そのポインタにメモリが割り当てられるかどうか疑問に思いましたか?

いいえ。変数ap変数はスタックに割り当てる必要があります。または、関数の外部にある場合は、グローバル変数としてメモリが割り当てられます。コンパイラは、これを自動的に実行します。

int a;    
int* p; 

...= <expression>初期値を指定するためのなし。基本的に、メモリ内のあるアドレスでは、識別している値を格納するためにいくつかのバイト(4または8など)が予約されa、別のアドレスでは、さらにメモリ(4または8バイトなど)が予約されます。呼び出す値を格納しますp

pwithの初期化は、の数値アドレスをメモリに&aコピーするだけです...それは[1]の割り当てを引き起こさず、それらのメモリを移動しません。ap

いくつかの作り上げられたアドレスを使用して、このように視覚化すると役立つ場合があります...

MEMORY-ADDRESS            CONTENTS           NAME
1000                      10                 a
2000                      1000               p

ここで、p「を指す」のは、のメモリaの内容がのアドレスpを保持しているためaです。ただし、およびのアドレスはap初期化やその他の値の変更に関係なく、コンパイラによって選択されます。

ここであなたを混乱させているのは、ポインタを使用するときにメモリを割り当てることが多いということです...次のようなものです。

p = new int;

intこれは、実行時に動的にメモリを見つけ、そのメモリのアドレスをにロードしpて、それを参照し、値pを格納するために使用できるようにすることintです。使い終わったらdelete p、メモリをシステムに戻すことができます。これにより、メモリをリサイクルして、別のメモリが完了したときに使用できるようになりますnew。このタイプの割り当ては、コード(または呼び出すライブラリ関数のコード)で明示的に実行する必要があります。

[1]-オプティマイザーは、実際のメモリを割り当てないこと、aおよび/またはp-代わりにCPUレジスタを使用することを選択できますが、プログラムの機能動作には影響しません(パフォーマンスに影響する可能性があります)。

于 2012-12-04T11:37:54.660 に答える
3

ポインタは単なる数字です。正しい範囲の数値を表し、プログラムの理解を助けるために特別なタイプがありますが、基本的には単なる数値です。

番号メモリアドレスを表します。それらを単純に補うことはできません。どこかから意味のあるアドレスを取得する必要があります。

あなたはできる:

  • 既存の変数のアドレスを取得します:p = &a; また
  • 「ヒープ」からメモリを割り当てます。p = malloc(size)

これで、メモリのアドレスを取得したら、完了です。これで、演算子を使用して、好きな場所でポインターを逆参照できます。**p = somedata

于 2012-12-04T12:06:52.957 に答える
2

いいえ、メモリは割り当てられません。pと同じ場所を実際に指し、&aで同じメモリを変更します*p = 20;。割り当てられたメモリ(の)を参照しているため、これはクラッシュしませんa。それがあなたが本当に欲しいものであるかどうかはあなただけに依存します。

于 2012-12-04T11:02:39.670 に答える
1

しかし、あるアドレスへのポインタを初期化すると、そのアドレスにメモリが割り当てられるかどうか疑問に思いました。

「メモリを割り当てる」とはどういう意味ですか?ポインタを作成するときは、そのメモリ、つまり、ポインタが存在し続けるために必要なメモリを(静的に)割り当てます。

それとは別に、ポインタが指すメモリがあります。int a = 10あなたがintを作成し、それを含むのに十分な大きさのメモリ空間を割り当てていると言うとき。
その場合、p = &a「私のポインタは、格納されているメモリアドレスを指している必要があります」という意味ですa。明らかに、すでに割り当てられaているので、安全に使用できます*pが、一般的にこれは正しくなく、初期化されていないポインタが不正なアドレスを指している可能性があります。

于 2012-12-04T11:10:06.607 に答える
0

いいえ、必要ありません。aポインタが変数のアドレスを指しているからです。したがって、を使用する*p = 20と、の値aが変わります。

だから、あなたの質問の答えはですYES。:)

于 2012-12-04T11:04:12.867 に答える