OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

ポインタが全く分かりません。

  • すぐに回答を!
  • 質問No.125450
  • 閲覧数51
  • ありがとう数0
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 86% (97/112)

今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 とした時はエラーが出るのでしょうか。

分かる人には申し訳ないほどの初歩的な質問でしょうが、全く分からないのでめちゃくちゃ困ってます。初心者にも分かりやすいように、なるべく詳しく回答していただけると、とても嬉しいです。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル10

ベストアンサー率 66% (103/155)

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

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

その他の回答 (全2件)

  • 回答No.1
レベル12

ベストアンサー率 40% (237/589)

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

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

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

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


  • 回答No.3
レベル12

ベストアンサー率 33% (196/589)

関数 swapが呼び出された時点で、値の確定しているのは*pxと*pyの2つです。 最初に「*px = tmp;」を実行しても、この時点ではtmpの値は確定していません。 確認したい事は2つあります。 この式において代入される方向は右側から左側です。 また、この入れ替えのアルゴリズムそのものを理解していますか? この問題は、ポインタの問題では無く、その前のアルゴリズムに理解が出来ていないように思 ...続きを読む
関数 swapが呼び出された時点で、値の確定しているのは*pxと*pyの2つです。
最初に「*px = tmp;」を実行しても、この時点ではtmpの値は確定していません。
確認したい事は2つあります。
この式において代入される方向は右側から左側です。
また、この入れ替えのアルゴリズムそのものを理解していますか?
この問題は、ポインタの問題では無く、その前のアルゴリズムに理解が出来ていないように思えます。
私の勘違いだったらすみません。
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ