今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.2ベストアンサー
- 回答日時:
C言語の「=」演算子は、(数学で使われる)「等しい」という意味ではなく、「代入する」という操作をあらわします。
(代入の操作の*後*、*結果的に*、等しくなります。)「tmp=*px」はpxポインタの実体を変数tmpへ代入します。
「*px=tmp」は変数tmpをpxポインタの実体へ代入します。
でご質問の2番目のプログラムは、変数tmpに初期値を入れずに使用したという「警告」が出ます。
No.3
- 回答日時:
関数 swapが呼び出された時点で、値の確定しているのは*pxと*pyの2つです。
最初に「*px = tmp;」を実行しても、この時点ではtmpの値は確定していません。
確認したい事は2つあります。
この式において代入される方向は右側から左側です。
また、この入れ替えのアルゴリズムそのものを理解していますか?
この問題は、ポインタの問題では無く、その前のアルゴリズムに理解が出来ていないように思えます。
私の勘違いだったらすみません。
No.1
- 回答日時:
> tmp = *px と *px = tmp は同じに見えるのですが、
ポインタ云々以前に、まず「代入文」を理解されていないようですね。
「tmp = *px」は「アドレス px で示す場所の内容を tmp に代入する」、
「*px = tmp」は「tmp の内容をアドレス px で示す場所に代入する」です。
x = y; と y = x; が同じでないのと全く同じレベルの問題です。
ポインタは関係ありません。
> なぜ tmp = *px だとちゃんとできて、
> *px = tmp とした時はエラーが出るのでしょうか。
tmp は宣言されただけで内容が定義されないまま値を参照しようとしたため、
たまたまそのメモリに入っていた値(ここでは 4404)が出てくると共に、
コンパイラがそのような誤りを検出して警告しているのです。
お探しの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ランキング
-
Input Type Buttonのサイズ変更
-
cssで点線を表示する方法
-
PNG画像の余白をカットする方法...
-
HTMLソースの中で、画像を表示...
-
画像にリンクを張ると画像がず...
-
1から100までの自然数のうち、2...
-
htmlの文字が縦書きになる
-
ポップアップメニューを表のよ...
-
smallにtext-allignが効かない
-
【ヒトの神秘】美男美女から何...
-
「諸要素」とはどういう意味で...
-
超音波で洗脳。
-
widthやheightの数値に単位(px...
-
line-height指定で発生する余白...
-
html5でheaderの中にnav
-
リストの数字のフォントサイズ...
-
ポップアップメニューの作成方...
-
CSS、width100%でもできる余白
-
cssで「下よせ」ってどうやって...
-
CSS(0の単位)について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macで画像の切り抜きできないの?
-
iPadのスクリーン座標のサイズ...
-
HTMLソースの中で、画像を表示...
-
ヘッダーデザインをするさい形...
-
iPhone Safari 画像の幅指定が...
-
テーブルのセル内のマージン
-
cssで点線を表示する方法
-
ボタンの配置
-
画用紙 26cm×37.5cmは 何px で...
-
スタイルシートの"_width"って...
-
サムネイル自動生成プラグインn...
-
Pythonでエクセルファイルの列...
-
十進BASICでのプログラム
-
横幅が2880pxを超えるデザイン...
-
ベイシックのプログラミングに...
-
横幅が狭いホームページ
-
スペーサーGIFの作り方
-
ブラウザ上で画像が縦長に表示...
-
FEDORA15のアイコンを小さくしたい
-
htmlの文字が縦書きになる
おすすめ情報