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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tape

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

#1

投稿記事 by tape » 14年前

ポインタのアドレスを入れ替えることで 参照するアドレスを変更する形に作り直すものなのですが、
&…アドレスをあらわす  *…中身をあらわす ことはわかるのですが、
入れ替えで *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);
}

アバター
へろりくしょん
記事: 92
登録日時: 14年前
住所: 福岡

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

#2

投稿記事 by へろりくしょん » 14年前

ぱっと見、ポインタの入れ替えの処理に問題は見あたりません。

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

tape

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

#3

投稿記事 by tape » 14年前

コード:


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

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

というエラーが出ました

アバター
へろりくしょん
記事: 92
登録日時: 14年前
住所: 福岡

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

#4

投稿記事 by へろりくしょん » 14年前

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; とします。

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

non
記事: 1097
登録日時: 14年前

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

#5

投稿記事 by non » 14年前

最初のプログラムにはエラーがありません。
後で書いてある
work = *p_a;
は、もちろんエラーです。
p_aにアドレスが格納されており、
*p_aはその指しているアドレスに格納されているintです。

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

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#6

投稿記事 by ISLe » 14年前

tape さんが書きました:&…アドレスをあらわす  *…中身をあらわす ことはわかるのですが、
違いますよ。
*…ポインタの中身が指し示す先の値をあらわす
ですね。
ポインタであろうとなかろうと、変数の中身は変数名であらわします。

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

tape

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

#7

投稿記事 by tape » 14年前

すいません。 ポインタはつい最近習い始めたもので、まだあまりよく理解できていません。

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

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

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

yoko
記事: 24
登録日時: 14年前

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

#8

投稿記事 by yoko » 14年前

見た限り最初のソースで正解です。
問題の意味は、
値そのものだけ値を交換しているのではなく、
アドレスを交換することにより値を交換しています。
仮に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
となります。

tape

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

#9

投稿記事 by tape » 14年前

ありがとうございました! 

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

閉鎖

“C言語何でも質問掲示板” へ戻る