【C言語】ポインタがわかりません。教えてください。【プログラミング】

ミューズの情報教室
27 May 202207:29

Summary

TLDRこのビデオでは、ポインタというプログラミングにおける概念を初心者にも理解しやすいように解説しています。ポインタのイメージをつかむために、関数とその使い方を例に挙げ、スワップ関数の動作を通じてポインタの重要性と使い方を説明します。ポインタは変数のアドレスを指す矢印であり、関数内で変数の値を直接操作するために使用されます。スワップ関数の例を通じて、ポインタを使わない場合と使う場合の動作の違いを比較し、ポインタを使ったバージョンでの動作を解説することで、ポインタの理解を深めることを目的としています。

Takeaways

  • 😀 スワップ関数は2つの変数を入れ替えるもので、ポインタを使って正しく動作する。
  • 🤔 ポインタは変数のアドレスを指し示す矢印のようなもので、その先の値を操作できる。
  • 🔍 スワップ関数を使わずに実装した場合、値のコピーが渡されるため入れ替えが反映されない。
  • 👉 ポインタを用いることで、関数内で変数の値を変更し、その変更が元の変数にも影響を与えることができる。
  • 📚 ポインタの概念は、プログラミング初心者にとって理解するのが難しいものである。
  • 💡 ポインタはメモリ内の特定の場所を指し示すため、その先の変数を直接操作することができる。
  • 🧐 ポインタを使ったプログラムでは、変数そのものではなく、その変数を指す矢印を関数に渡す。
  • 🛠️ ポインタの使い方とその利点を理解することは、高度なプログラミングスキルを身に付けるために重要である。
  • 🔑 ポインタはC言語などの低レベル言語で特に重要な役割を果たし、メモリ操作を直接行うために使用される。
  • 📈 ポインタを理解することで、より効率的で強力なコードを書くことができ、プログラミング能力が向上する。

Q & A

  • ポインタとは何ですか?

    -ポインタは、変数のアドレスを指し示す変数であり、その変数が格納されているメモリの場所を示す矢印のようなものです。

  • ポインタを使う必要がある理由は何ですか?

    -ポインタを使うことで、関数内で変数の値を直接操作し、その変更が元の変数にも反映されるためです。

  • スワップ関数とは何ですか?

    -スワップ関数は、2つの変数に格納された値を入れ替えるものです。

  • ポインタを使わない場合、スワップ関数で変数の値が入れ替わるとは言えませんが、なぜですか?

    -ポインタを使わない場合、関数に渡されるのは値のコピーであり、元の変数には影響を与えられないためです。

  • ポインタを使ったバージョンのスワップ関数では、どのようなことが異なるですか?

    -ポインタを使ったバージョンでは、変数のアドレスを関数に渡すため、関数内でその変数を直接操作し、元の変数にも変更が反映されます。

  • ポインタを使ったプログラムの利点は何ですか?

    -ポインタを使うことで、関数間での変数の共有や変更が可能となり、メモリの効率的な使用やプログラムの柔軟性が向上します。

  • ポインタのイメージとして矢印と表現される理由は何ですか?

    -矢印は方向性を持ち、特定の場所を指し示すための視覚的な表現であり、ポインタが変数の場所を示す役割を持っている点で類似しているためです。

  • ポインタを使わない場合に、関数内で変数の値を変更したい場合はどうすればよいですか?

    -ポインタを使わない場合、参照渡しや戻り値を用いて関数から値を受け取るなどの方法がありますが、ポインタを使った方が効率的で簡便です。

  • ポインタを使ったプログラムの例を見て、どのような点を注意深く見直すべきですか?

    -ポインタを使ったプログラムでは、変数のスコープやメモリの管理、参照先の有効性などに注意を払い、誤ったポインタの使用を避ける必要があります。

  • ポインタに関する基本的な理解を深めるためには、どのような練習を行うと良いですか?

    -ポインタに関する基本的な理解を深めるためには、実際にプログラムを書いて動作を確認したり、ポインタを使った様々な例を試してみることが効果的です。

Outlines

00:00

🤔 ポインタの理解とその重要性

この段落では、プログラミングにおけるポインタの概念とその理解の難しさを紹介しています。ポインタを理解することの重要性と、なぜポインタを使う必要があるかについて説明されています。また、関数の基本的な動作と、スワップ関数を例に関数の動作を説明していますが、ポインタを使わない場合の問題点も触れられています。

05:01

🔍 ポインタを使ったスワップ関数の動作

ポインタを使わずにスワップ関数を実装した場合の問題を指摘し、ポインタを使うことでどのように動作が変わるかを解説しています。ポインタは変数のアドレスを指し示すためのものであり、ポインタを関数に渡すことで、実際の変数の値を変更することができると説明されています。この段落では、ポインタを使ったスワップ関数のコード例とその動作を説明しており、ポインタの理解を深める上で重要なポイントが挙げられています。

Mindmap

Keywords

💡ポインタ

ポインタはメモリ上の特定の場所を指し示す矢印のようなもので、変数のアドレスを保持します。動画では、ポインタを使用して変数の実際の値を操作する方法を説明しています。具体的には、スワップ関数で変数の値を入れ替える例を通じて、その重要性が強調されています。

💡スワップ関数

スワップ関数は、2つの変数の値を入れ替えるための関数です。動画では、まずポインタを使わないスワップ関数の動作を示し、その後にポインタを使うことで正しく動作するバージョンを説明しています。この関数の例を通じて、ポインタの必要性が理解しやすくなっています。

💡変数

変数はプログラム内でデータを保存するための名前付きの場所です。動画では、xとyという変数に具体的な値(7と12)を代入し、スワップ関数に渡す例が使われています。これにより、変数の基本的な役割とポインタとの関係が示されています。

💡アドレス

アドレスはメモリ内の特定の位置を示す識別子です。ポインタはこのアドレスを保持し、その場所に保存されているデータにアクセスします。動画では、aとbのアドレスをポインタとしてスワップ関数に渡すことで、変数の値を正しく入れ替える方法が説明されています。

💡メイン関数

メイン関数はプログラムの実行開始点となる関数です。動画では、aとbに値を代入し、スワップ関数を呼び出し、その後に値を表示する例が示されています。メイン関数からスワップ関数へのデータの流れを理解する上で重要な役割を果たします。

💡コピー

コピーとは、データを複製することを指します。動画では、変数の値をコピーする場合と、ポインタを使ってアドレスをコピーする場合の違いが説明されています。変数の値のコピーでは元の変数に影響を与えない一方、ポインタを使うと元の変数の値を直接変更できます。

💡関数

関数は特定の処理をまとめて再利用可能にしたコードのブロックです。動画では、スワップ関数を通じて関数の基本的な概念が説明され、入力として受け取る値と出力の関係が強調されています。関数は入力を受け取り、処理を行って結果を返す仕組みです。

💡アルゴリズム

アルゴリズムは特定の問題を解決するための手順や方法のことです。動画では、スワップ関数における値の入れ替えアルゴリズムが説明されています。最初に失敗するアルゴリズムを示し、その後にポインタを使った正しいアルゴリズムを紹介しています。

💡メモリ

メモリはコンピュータがデータを保存し、アクセスするための場所です。ポインタはメモリのアドレスを保持するため、変数の実際の値を操作できます。動画では、変数の値がメモリのどこかに保存されていることを示し、その場所を指すポインタの役割が説明されています。

💡イメージ

イメージとは、概念や仕組みを視覚的に理解するための心象や比喩のことです。動画では、ポインタのイメージを矢印として説明し、視聴者が直感的に理解しやすいように工夫されています。ポインタの抽象的な概念を具体的なイメージで捉えることで、理解が深まります。

Highlights

プログラミングの勉強をしているが、ポインタが理解しにくいという相談。

ポインタのイメージを掴むための解説を開始。

ポインタを使う理由を説明。

関数の基本的な仕組みを確認。

スワップ関数の説明。

スワップ関数が正しく動作しない例を紹介。

ポインタが変数の場所を指し示す役割について解説。

ポインタを使わない場合のプログラムの動作を確認。

ポインタを使わないとスワップ関数が期待通りに動作しない理由を説明。

ポインタを使ったプログラムに書き換え。

ポインタを入力することで変数の場所を指し示す矢印がコピーされる。

矢印の先にある変数を操作できるようになる。

ポインタを使うことで関数内外で同じ変数を操作できる。

矢印のコピーを渡すことで変数の値を入れ替えられる。

視聴者にポインタのイメージを掴んでもらうことが目的。

Transcripts

play00:00

幼霊夢

play00:01

最近プログラミングの勉強をしてるんだが

play00:04

ポインタがいまいちよくわからないから

play00:06

教えてくれだぜわかったわじゃあ今回は

play00:10

ポイントについて解説しましょうと言って

play00:12

も細かい記号などについて詳しく解説する

play00:15

ということではなくてポインタのイメージ

play00:18

をつかんでもらうために

play00:20

て頂ければと思いますなぜポインターを

play00:22

使わなきゃいけないのか

play00:24

それがなんとなくでも理解してもらえたら

play00:26

と思いますよろしくだぜ

play00:29

この動画にたどり着いた人はおそらく

play00:32

ポインタを一度は聞いたことがあるけど

play00:34

それがどういうものかはよく分かってい

play00:36

ない人だと思います私みたいなポイント

play00:38

初心者を想定してるんだなポインターは

play00:41

アドレスだとか矢印だとか言われてるが

play00:43

いまいち理解しきれてないんだよな

play00:46

ポインタの使い方を説明するために関数を

play00:49

持ち出しますのでまずは関数について確認

play00:52

しておきましょう

play00:53

館数はいくつかの処理をまとめたものじゃ

play00:56

なかったかそうですいくつかの処理があっ

play00:58

たときにそれを一つにまとめて別のところ

play01:01

に書いておくのが関数というものです関数

play01:04

は何か入力を受け取るとその入力に

play01:07

いろいろ手を加えて結果を出力います入力

play01:10

を受け取って出力するってのが大きな流れ

play01:13

だよな現実の世界で言えば自動販売機の

play01:16

ボタンを押して入力するとジュースという

play01:18

出力が出てくるピアノの鍵盤を押して入力

play01:21

すると音が出力として出てくる合言葉を

play01:24

言うと7つの玉から優雅でてクルー

play01:27

ドラゴンボールじゃねーかというものなど

play01:29

がありますね至る所に関数と呼べるものが

play01:32

あるんだな今からはスワップ関数という

play01:35

ものを考えてみましょう

play01:36

それはどんな関数なんだ

play01:38

スワップ関数には2つの変数が入力として

play01:41

あります変数には何か値が一つずつ入っ

play01:44

てるんだよな

play01:45

の2つの値を入れ替えるというのが

play01:47

スワップ関数の機能です今 x と y

play01:50

っていう変数に7と12っていう数字が

play01:52

入ってたらスワップ関数に入れると x と

play01:56

y の値は12と7に変化するってことだ

play01:58

なまさにそうですもし変数って何だっけと

play02:02

いう人がいたらこちらの動画を見てみて

play02:04

くださいとりあえず x と y の数字

play02:07

を入れ替える関数だってのはわかったぜ

play02:09

この時関数の中身はどう書いたら良い

play02:12

でしょうか x と y を入れ替えるん

play02:14

だろじゃあ x2 y を代入して y に

play02:17

x を代入すれば終わりだろ残念でしたあ

play02:19

みーこうすると x と y にどちらも

play02:22

12という数字が入ってしまいますえっ

play02:25

なんでだこのアルゴリズムだと x2 y

play02:28

を代入した時点で x が上書きされて x

play02:31

と y の値が同じになってしまうから

play02:32

です

play02:33

ありゃ確かにそうだな正しくはこのように

play02:36

3つ目の変数を用意して x の数字を

play02:39

いったん避けておく必要があります

play02:41

3つも式が出てきてややこしいな図で確認

play02:43

してみるとまずへ素の値を添付にコピーし

play02:46

て次に y を x に代入して

play02:49

最後に添付の値を愛に代入すれば x と

play02:52

y の値が入れ替わるという動きになって

play02:54

いますなるほど確かにこれで

play02:57

x と y の数字を入れ替えることが

play02:58

できるな

play02:59

それでポインタはいつ出てくるんだ

play03:02

ポイントは今から使いますですがその前に

play03:04

ポインタを使わないとうまくいかないと

play03:07

いうことを確認しておきましょう

play03:09

というわけでプログラムを書いてみました

play03:11

実際に c 言語でプログラムを書くと

play03:13

こうなるんだな

play03:15

上のブロックはスワップ関数でしたが

play03:17

メインの関数です a 27 b 22を

play03:20

代入してスワップ関数に a と b を

play03:22

入れて最後に a と b の値を表示し

play03:24

てるんだなじゃあ最後は a コール12

play03:27

b コール7と表示されるはずだなフ

play03:31

本当にそうでしょうか

play03:32

実際に実行するとこのような結果が得られ

play03:35

ますあれスワップ関数を通ったのに a と

play03:38

b の値は入れ替わってないじゃないか

play03:40

どうしてだポインターを使わないとこう

play03:42

いうことが起こるのですではポインタとは

play03:45

一体何者なんでしょうかこの動画では

play03:47

イメージしやすいようにポインターを矢印

play03:50

で表現することにしますポインターは矢印

play03:53

例えば a という変数があった時に

play03:55

ポインタはその a の場所を矢印で示し

play03:58

ます a の場所を矢印で表す件数という

play04:01

のはコンピュータ上ではメモリのどこかの

play04:04

場所に保存されていますその a の場所

play04:06

を示すのがポインタの役割です変数の居

play04:09

場所を表すのか

play04:10

ここでは詳しく理解できなくても大丈夫

play04:12

です先ほどポインターを使わない

play04:15

プログラムを紹介しましたがその場合の

play04:17

動作はどうなっているのかを確認してみ

play04:20

ますまずスワップ関数に a と b を

play04:22

入力するわけですすると main 関数

play04:24

からスワップ関数に移り処理が行われます

play04:28

そうだなこのとき実は x 度合いにはa

play04:31

8 b 入っている数字だけが送られてき

play04:34

ます a とか b そのものじゃなくて

play04:36

変数の中に入っている数字だけなのか関数

play04:39

というのはそういう性質で入力された変数

play04:42

の値をコピーして関数に入力しますつまり

play04:45

スワップ関数の x と y には7と

play04:48

12という値だけが送られてくるんだな

play04:50

そして x と y の値が入れ替わり x

play04:53

には12倍には7という数字が入りますが

play04:55

元々の a 8 b には何も影響を与え

play04:58

ていません a と b の中の数字を

play05:00

送っただけだからなつまり a と b の

play05:03

数字は入れ替わらず結果には a コール

play05:05

7 b コール12と表示されたわけです

play05:07

なるほどなこういう動作をしてたのか

play05:10

じゃあ a 8 b を入れ替えるには

play05:12

本当はどうしたらよかったんだ

play05:14

そこでポインタが大活躍しますここからが

play05:17

一番の重要ポイントですプログラムを

play05:19

ポインターを使ったバージョンに書き換え

play05:21

てみますうは意味のわからない記号が増え

play05:24

たぜプログラムの変わったところは置いて

play05:27

おいてプログラムがどのように動作するの

play05:29

かそのイメージだけ確認しましょう aok

play05:32

だぜまず a と b に事12を代入

play05:35

するところは同じですそしてスワップ関数

play05:37

には a や b ではなく a や b

play05:39

の場所を指すポインタを入力します

play05:41

ポインタを入力にするとどうなるんだ

play05:44

先ほどと同じようにスワップ関数に移り

play05:46

ますが x や y には a と b の

play05:49

数字がコピーされるのではなく矢印が

play05:51

コピーされてきます a とか b を

play05:53

示す矢印がコピーされてくるのかポインタ

play05:56

の性質として矢印で示した先にある変数は

play06:00

月に書き換えられるのでこうすることで

play06:02

スワップ関数から a や b の値を

play06:04

操作できるようになります

play06:06

ポインタの先の変数をいじるのはできるん

play06:08

だななのであとは a と b の中に

play06:10

入った数字を入れ替えることができ

play06:13

再びメイン関数に戻ってきても a と b

play06:15

はちゃんと入れ替わった状態になっている

play06:17

というわけです値そのものじゃなくて矢印

play06:20

をコピーすることで a と b を操作

play06:22

できるんだなもう一度まとめておきます

play06:25

まずスワップ関数に a や b の場所

play06:28

を示す矢印が入力されるスワップ関数では

play06:31

a や b の場所を指す矢印を受け取る

play06:33

そして矢印の先にある a と b の値

play06:35

を入れ替えるこれで a と b の中の

play06:38

数字を入れ替えることができます

play06:40

矢印で見てる先は main 関数内でも

play06:43

スワップ関数内でも同じだてのがミソだな

play06:46

ポインタの話はまだまだ奥が深いですが

play06:48

今回の動画でそのイメージだけでもつかん

play06:51

でいただくことができたら幸いですじゃあ

play06:53

この辺で解説は終わります

play06:57

というわけで今回はポイントについて解説

play07:00

しましたあたいのコピーじゃなくて矢印の

play07:03

コピーを渡すことでうまくいくこともある

play07:05

んだな他にもプログラミングで困っている

play07:08

ことがあればコメント欄に書いてみて

play07:10

くださいどんなことでも大丈夫だぜじゃあ

play07:13

今回の解説はこれくらいにしますご視聴

play07:16

ありがとうございました

play07:17

今画面に出てる動画も是非ご覧くださいだ

play07:19

Rate This

5.0 / 5 (0 votes)

Étiquettes Connexes
ポインタプログラミング初心者解説C言語関数スワップメモリ矢印入門
Besoin d'un résumé en anglais ?