ページ 11

アドレスを用いた数値の入れ替え

Posted: 2011年9月08日(木) 16:22
by tape
ポインタのアドレスを入れ替えることで 参照するアドレスを変更する形に作り直すものなのですが、
&…アドレスをあらわす  *…中身をあらわす ことはわかるのですが、
入れ替えで *workの様にしてみてもエラーになるだけで、 全然思いつきません。
アドバイスお願いします。

コード:

#include<stdio.h>
main(){
	int *p_a,*p_b,*work;
	int a = 100,b = 200;

	p_a = &a;
	p_b = &b;
	printf("実行前:*p_a = %d   *p_b = %d\n",*p_a,*p_b);

	work = p_a;
	p_a = p_b;
	p_b = work;

	printf("実行後:*p_a = %d   *p_b = %d",*p_a,*p_b);
}

Re: アドレスを用いた数値の入れ替え

Posted: 2011年9月08日(木) 16:42
by へろりくしょん
ぱっと見、ポインタの入れ替えの処理に問題は見あたりません。

こういう場合は、どんなエラーが出たか、エラーメッセージがあるならそれを貼り付けてくれると大変助かります。

Re: アドレスを用いた数値の入れ替え

Posted: 2011年9月08日(木) 16:55
by tape

コード:


	work = *p_a;
	p_a = *p_b;
	p_b = work;

アドレスを代入すればいいと思って上のようにしたのですが、
間接参照のレベルが int* とintで異なっています

というエラーが出ました

Re: アドレスを用いた数値の入れ替え

Posted: 2011年9月08日(木) 17:03
by へろりくしょん
tape さんが書きました:

コード:


	work = *p_a;
	p_a = *p_b;
	p_b = work;

アドレスを代入すればいいと思って上のようにしたのですが、
間接参照のレベルが int* とintで異なっています

というエラーが出ました
work の型は int* です。 p_a, p_b の型の int* です。
で、*p_a, *p_b の型は、int です。
ですから、work = *p_a; とした場合、int* と int で異なってますね。


ここは、work = p_a; とします。

というより、最初に提示されたコードではそのように書いているようですが。

Re: アドレスを用いた数値の入れ替え

Posted: 2011年9月08日(木) 17:08
by non
最初のプログラムにはエラーがありません。
後で書いてある
work = *p_a;
は、もちろんエラーです。
p_aにアドレスが格納されており、
*p_aはその指しているアドレスに格納されているintです。

で、やりたいことは、何でしょうか?
aとbの中身をp_aとp_bを使っての入れ替えでしょうか?

Re: アドレスを用いた数値の入れ替え

Posted: 2011年9月08日(木) 17:12
by ISLe
tape さんが書きました:&…アドレスをあらわす  *…中身をあらわす ことはわかるのですが、
違いますよ。
*…ポインタの中身が指し示す先の値をあらわす
ですね。
ポインタであろうとなかろうと、変数の中身は変数名であらわします。

ポインタ型の変数に何が入っているのかをじっくり考えてみてください。

Re: アドレスを用いた数値の入れ替え

Posted: 2011年9月08日(木) 17:30
by tape
すいません。 ポインタはつい最近習い始めたもので、まだあまりよく理解できていません。

この問題の前に、ポインタを使って2つの数を入れ替えなさいというプログラムを作りました。
それが最初のソースなんですが、

何がしたいかというより
ポインタのアドレスを入れ替えることで 参照するアドレスを変更する形に変更する 
という問題の意味自体がわかっていません 

ポインタはアドレスしか入らないと習ったのですが、最初のソースで正解ですか?

Re: アドレスを用いた数値の入れ替え

Posted: 2011年9月08日(木) 18:17
by yoko
見た限り最初のソースで正解です。
問題の意味は、
値そのものだけ値を交換しているのではなく、
アドレスを交換することにより値を交換しています。
仮にp_aのアドレスを10番地、p_bのアドレスを20番地とすると、
値そのものだけ値を交換の場合は
交換前
p_a:10番地→100
p_b:20番地→200
交換後
p_a:10番地→200
p_b:20番地→100
一方、
アドレスを交換の場合は
交換前
p_a:10番地→100
p_b:20番地→200
交換後
p_a:20番地→200
p_b:10番地→100
となります。

Re: アドレスを用いた数値の入れ替え

Posted: 2011年9月08日(木) 18:41
by tape
ありがとうございました! 

とてもわかりやすい説明でした。
また詰まることがあればよろしくお願いします。