今C言語を勉強していて、先日やっとポインタに取り組み始めました。でもいきなりわけ分からなくなってしまいました。自分なりに本やホームページで調べてみたのですが、説明が全く載っていなかったので、質問させてもらいました。

/* 2つの値の交換 (正) */

#include<stdio.h>

void swap(int *px, int *py)
{int tmp;

tmp = *px;
*px = *py;
*py = tmp;
}

void main()
{int a=3, b=5;

printf("a=%d, b=%d\n", a, b);
swap(&a, &b);
printf("a=%d, b=%d\n", a, b);

return 0;
}

実行結果  a=3, b=5
        a=5, b=3



/* 2つの値の交換 (誤) */

#include<stdio.h>

void swap(int *px, int *py)
{int tmp;

*px = tmp;
*px = *py;
*py = tmp;
}

void main()
{int a=3, b=5;

printf("a=%d, b=%d\n", a, b);
swap(&a, &b);
printf("a=%d, b=%d\n", a, b);

return 0;
}

エラーメッセージ 『Warning:'tmp' used before set』

実行結果  a=3, b=5
        a=5, b=4404

tmp = *px と *px = tmp は同じに見えるのですが、なぜ tmp = *px だとちゃんとできて、*px = tmp とした時はエラーが出るのでしょうか。

分かる人には申し訳ないほどの初歩的な質問でしょうが、全く分からないのでめちゃくちゃ困ってます。初心者にも分かりやすいように、なるべく詳しく回答していただけると、とても嬉しいです。

A 回答 (3件)

C言語の「=」演算子は、(数学で使われる)「等しい」という意味ではなく、「代入する」という操作をあらわします。

(代入の操作の*後*、*結果的に*、等しくなります。)

「tmp=*px」はpxポインタの実体を変数tmpへ代入します。
「*px=tmp」は変数tmpをpxポインタの実体へ代入します。
でご質問の2番目のプログラムは、変数tmpに初期値を入れずに使用したという「警告」が出ます。
    • good
    • 0

関数 swapが呼び出された時点で、値の確定しているのは*pxと*pyの2つです。


最初に「*px = tmp;」を実行しても、この時点ではtmpの値は確定していません。
確認したい事は2つあります。
この式において代入される方向は右側から左側です。
また、この入れ替えのアルゴリズムそのものを理解していますか?
この問題は、ポインタの問題では無く、その前のアルゴリズムに理解が出来ていないように思えます。
私の勘違いだったらすみません。
    • good
    • 0

> tmp = *px と *px = tmp は同じに見えるのですが、



ポインタ云々以前に、まず「代入文」を理解されていないようですね。
「tmp = *px」は「アドレス px で示す場所の内容を tmp に代入する」、
「*px = tmp」は「tmp の内容をアドレス px で示す場所に代入する」です。
x = y; と y = x; が同じでないのと全く同じレベルの問題です。
ポインタは関係ありません。

> なぜ tmp = *px だとちゃんとできて、
> *px = tmp とした時はエラーが出るのでしょうか。

tmp は宣言されただけで内容が定義されないまま値を参照しようとしたため、
たまたまそのメモリに入っていた値(ここでは 4404)が出てくると共に、
コンパイラがそのような誤りを検出して警告しているのです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報