今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 とした時はエラーが出るのでしょうか。
分かる人には申し訳ないほどの初歩的な質問でしょうが、全く分からないのでめちゃくちゃ困ってます。初心者にも分かりやすいように、なるべく詳しく回答していただけると、とても嬉しいです。
No.1
- 回答日時:
> tmp = *px と *px = tmp は同じに見えるのですが、
ポインタ云々以前に、まず「代入文」を理解されていないようですね。
「tmp = *px」は「アドレス px で示す場所の内容を tmp に代入する」、
「*px = tmp」は「tmp の内容をアドレス px で示す場所に代入する」です。
x = y; と y = x; が同じでないのと全く同じレベルの問題です。
ポインタは関係ありません。
> なぜ tmp = *px だとちゃんとできて、
> *px = tmp とした時はエラーが出るのでしょうか。
tmp は宣言されただけで内容が定義されないまま値を参照しようとしたため、
たまたまそのメモリに入っていた値(ここでは 4404)が出てくると共に、
コンパイラがそのような誤りを検出して警告しているのです。
No.2ベストアンサー
- 回答日時:
C言語の「=」演算子は、(数学で使われる)「等しい」という意味ではなく、「代入する」という操作をあらわします。
(代入の操作の*後*、*結果的に*、等しくなります。)「tmp=*px」はpxポインタの実体を変数tmpへ代入します。
「*px=tmp」は変数tmpをpxポインタの実体へ代入します。
でご質問の2番目のプログラムは、変数tmpに初期値を入れずに使用したという「警告」が出ます。
No.3
- 回答日時:
関数 swapが呼び出された時点で、値の確定しているのは*pxと*pyの2つです。
最初に「*px = tmp;」を実行しても、この時点ではtmpの値は確定していません。
確認したい事は2つあります。
この式において代入される方向は右側から左側です。
また、この入れ替えのアルゴリズムそのものを理解していますか?
この問題は、ポインタの問題では無く、その前のアルゴリズムに理解が出来ていないように思えます。
私の勘違いだったらすみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- C言語・C++・C# プログラミングのペーパーテスト 実行結果の表示を答えてください #include <stdio.h> 2 2022/07/09 16:14
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cssで点線を表示する方法
-
Macで画像の切り抜きできないの?
-
ヘッダーデザインをするさい形...
-
htmlの文字が縦書きになる
-
htmlのolやulなどlistにtitleや...
-
ボタンをセル内一杯に表示させ...
-
【ヒトの神秘】美男美女から何...
-
超音波で洗脳。
-
リンクを知らせる手のマークが...
-
idの中のid指定
-
<h1>、<h2>と<p><div>の行間を...
-
W3Cのソースコードの検証サービ...
-
CSS:overflow要素の印刷について
-
html の divとtable の役割
-
複数行にまたがる括弧を表示し...
-
<div id="container">の使いか...
-
input type="hidden"で取得した...
-
HTML属性での「""」 「''」違い
-
wordpressでキャプション内で改...
-
divタグ内のコンテンツが重なっ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macで画像の切り抜きできないの?
-
iPhone Safari 画像の幅指定が...
-
ヘッダーデザインをするさい形...
-
スタイルシートの"_width"って...
-
iPadのスクリーン座標のサイズ...
-
オンマウスで画像がぶれる(High...
-
ブラウザ上で画像が縦長に表示...
-
横幅が狭いホームページ
-
Pythonでエクセルファイルの列...
-
Dreamweaverでレイヤーを点線で...
-
photoshop切り抜きすると1pxに...
-
HTMLソースの中で、画像を表示...
-
cssで点線を表示する方法
-
ラグランジェの未定係数を使っ...
-
PNG画像の余白をカットする方法...
-
テーブルのセル内のマージン
-
画用紙 26cm×37.5cmは 何px で...
-
十進BASICでのプログラム
-
FEDORA15のアイコンを小さくしたい
-
インラインフレームの一部を撮...
おすすめ情報