2013-05-12 27 views
5

プログラム:ポインタとCでのメモリ割り当て

int x; 
int *y; 
int **z; 

z = (int **) malloc (sizeof(int *)); 
y = (int *) malloc (sizeof(int)); 
x = 1; 
*z = &x; 
*y = x; 
. 
. 
. 

質問:私は、xと* yのポイントのアドレス* zのポイントを理解して何から

*z = &x; 
*y = x; 

:違いを何ですか xには向いていますが、* yはxのアドレスを必要としません。私は本当にこれらの2つの変数で何が起こっているのか分かりません。

編集: また、変数がスタックまたはヒープに割り当てられたときはいつ知っていますか?

  • x、y、zがスタックに割り当てられるのはなぜですか?
  • ヒープ上に* y、** y、* z、** zが割り当てられているのはなぜですか?

最後に、* z、change ** zを変更しますか?

+0

「私が理解したところから...」あなたは誤解しています。 zとyは、割り当てられたときに指し示したメモリブロックを指しています。 –

+0

Cで 'malloc()'の戻り値をキャストすべきではありません。これはプロトタイプがないという不具合を特定するのに役立ちます。 – jxh

+1

まず第一に、最後の2つのステートメントが全く異なることを理解する必要があります。最初のものは、xの*アドレス*をzが指すものに割り当て、2番目のものはxの*値*をyの指すものに割り当てます。値を割り当てると、元のコピーとコピーが「切断された」状態になるので、一方を変更すると他方は変更されません。しかし、あなたがちょうどアドレスを使用すると、2人は股関節に参加し、もう1人はあなたを変えます。 –

答えて

6

zは、ポインタ(通常は動的に割り当てられたポインタの配列を指すポインタ)へのポインタです。

yは、intへのポインタです。繰り返しますが、しばしば、動的に割り当てられる配列intを指します。

したがって、*z = &x;は、zが指すポインタをxに設定しています。すなわち、zは、ポインターを指します(順に)はxを指しています。

*y = x;xを取り、yによって指さintに代入されます。

このような場合は、画像が役立つことがよくあります。だから、私たちの基本的な定義は私達にこれを与える:

enter image description here

ザ・私たちは:私たちはこの与え

z = (int **) malloc (sizeof(int *)); 
y = (int *) malloc (sizeof(int)); 

enter image description here

はその後、我々はやる:

*z = &x; 
*y = x; 
私たちはこれを与え

:実線は一つの場所から別の値をコピー示しながら、これらの全てにおいて

enter image description here

は、破線は、一つの場所から別のポインタを意味します。

これらの間の長期的な違いについて検討することができます。たとえば、上記のすべての割り当ての後にx=2;を追加するとどうなるか考えてみましょう。この場合

我々はxから*yに価値1をコピーしたので、*yはまだ、1に等しくなります。 **zxへのポインタなので2と等しくなります。xの変更は**zに反映されます。

2

この行は、メモリ内の変数xアドレスを格納がzによって指さ:

*z = &x; 

このラインがメモリにxを格納yによって指さ:

*y = x; 

2つの代入文は無関係です:2番目の代入文はコピーwhを作成します最初のものはそうしない。 xの値を変更して**zを取得すると、新しい値xが表示されます。ただし、*yを取得すると、古い値x(つまり1)が返されます。

+0

ありがとうございました!これは非常に意味をなさない! –

0

2つの割り当て間の差が第1の(* Z)指さ秒(* y)がアドレス値の割り当てであるポインタの値としてアドレスタイプの割当て であるということですyによって。

両者は、それらが指し示すメモリに値を割り当てます。

差異は、割り当てられたメモリに書き込まれる値のタイプです。 最初の値はアドレスであるため、値のxのアドレスを取得します。 2番目の値は整数で、xの値を取得します。

* yはxを指しません。

xの値がコピーされる未知のメモリ位置を指します。 これは、yのために割り当てられたメモリ空間にxの値を代入します。

関連する問題