6/5(金)〜6/8(月) の学習ログです(主にC言語)
こんばんは。
いつもありがとうございます。
朝型生活にだいぶ慣れてきた安藤です。
新型コロナの影響で家にいる時間が多くなり緑が欲しくなって昨日お花屋さんで「コウモリラン」という観葉植物を購入しました。
部屋に緑があると良い感じです。
なぜ良い感じなのか。
ここには何があるのかというと、僕達は人間であるということ。
この人間というシステムをよく理解して使いこなすことが大事ということ。
要は人間は緑が好き!というか、一緒に何百年も一緒に生活を共にしてきているから大切なパートナーというか。
そうそう!イリノイ大学の研究で「お花や植物を飾ることで得られるビタミンF」なるものがあるみたいっす。
あの手この手を使って、プログラミング 学習を前に進めていきたいです。
そんなこんなで、学習ログを残していきます。
2020.6.5(金)
◎C言語(web記事「苦しんで覚えるC言語」)
●ポインタ変数の仕組み
・ポインタ専用の書き方
ポインタ演算と呼ばれる書き方
*(ポインタ変数+要素番号)
先頭にある*は、ポインタ変数を通常変数モードに切り替えるための演算子。
()をつけて、ポインタ変数のアドレス値に要素番号分の足し算を行い、その足し算されたアドレス値を通常変数モードに切り替えることで、先頭アドレスから指定数だけ進んだ先のメモリにアクセスする方法。
・ポインタ演算
ポインタ変数に加減算を行って配列の要素を使う書き方。
2020.6.6(土)
◎C言語(web記事「苦しんで覚えるC言語」)
●ポインタ変数の仕組み
・古き悪きポインタ演算
次の2つは同じ意味だけど、分かりにくい。
data[5]
*(data + 5)
昔は、++を使って増加していくポインタ演算は高速だったけど、
現在はコンパイラの性能が飛躍的にアップしている。
現在のコンパイラは、[ ] でアクセスしているようなループを見つけたら自動的に++で増加するポインタ演算のような書き方に置き換えてコンパイルしてくれる。
これはC言語が誕生した時には、そんなコンパイラがなかったから。
・組み込みでは
ほとんどのパソコン向けのコンパイラは適切な最適化を行ってくれる。
さらにパソコン用のCPUは内部のキャッシュの仕組みが複雑かつ高性能であり、繰り返し処理をCPUが独自に最適化して速度を向上するような仕組みがある。
そのため、現代的なパソコンでは、どちらの書き方をしても結局同じ速度になる。
しかし、組み込み(家電などに内蔵される低性能なコンピュータ)ではそうとも限らない。
コンパイラによる最適化は十分には機能しないことも多いし、
CPUの仕組みが単純なので、プログラムの書き方が速度にそのまま反映されやすくなっている。
そういう場合はポインタ演算は現代でも有効。
2020.6.7(日)
◎C言語(web記事「苦しんで覚えるC言語」)
●ポインタ変数の仕組み
・アドレスのことは忘れましょう
ポインタ変数の本当の使い方は、変数のショートカットとして使いこと。
アドレスを操作することではない。
ポインタ変数がアドレスを記憶するのは仕組みであり、使い方ではないということ。
使い方さえ分かっていれば、内部処理がどんな仕組みだろうと無関係。コンピュータの仕組みを全く知らなくても使えるのと同じ。でもここの理解が大事だよね。
変数に&をつけてショートカットを設定し、*記号をつけて通常モードにして使用する。
この手順に従って使う限り、アドレスなど関係なく使えるのさ。
ただ、C言語では時折、非常な不可解なバグが起こる。
その場合、その原因の多くはポインタ変数の使い方を間違えているためらしい。
バグの修正の時に、ポインタ変数がアドレスを記憶する変数であることを思い出し、どこかで間違ったアドレスが代入されていないか調べることが必要になるっす。
2020.6.8(月)
◎C言語(web記事「苦しんで覚えるC言語」)
●複数の型をまとめる
異なる型の変数をまとめる
・まとめてデータを扱いたい場合
構造体という機能が用意されている。
※C++では、「class」は予約語。
構造体とは、複数の異なる型をまとめて作られた型のこと。
構造体の型を宣言するには、はじめに「struct(ストラクト)」をつける。
その次には、変数と同じルールの元、新しく宣言する構造体の型名をつける。
この型名を、「構造体タグ名」と呼ぶ。
構造体タグ名は、作成した構造体それ自体の名前で、厳密には型名ではないので注意。
実際に使うためには、構造体の型の変数を宣言する必要がある。
struct student data;
この例では、struct構造体タグの、data構造体変数を宣言している。
構造体タグの変数を宣言する場合、はじめにstructをつける。
次に構造体の型名、最後に構造体変数の名前を指定する。
構造体の型を構造体タグ、構造体タグで宣言された変数を構造体変数と呼ぶ。
C言語の拡張版であるC++では、structをつけなくても構造体変数を宣言できる。
現在のコンパイラはほとんどがC++用なので、structをつけなくても宣言できる。
構造体タグは、関数よりも先に宣言するのが普通。
はい、今回はこれで以上です。
C言語の構造体について学んでいて、
どこまで行ってもプログラミング の仕組みには大きな共通点があってそこを理解することがとても大切だと思う。
プログラミング 学習をはじめた昨年の夏は、 「どの言語を習得したらいいんだろう??」 と思っていたが、
今では、プログラミング言語の違いって、 ストリートファイターⅡのリュウやケン、エドモンド本田みたいに、ただただキャラの違いくらいにしか感じなくなった。
要は使いやすくて、ゲームに勝てればOK!という世界観だ。
結局、最後は機械語に翻訳されて動くのだからね。
ケンはPythonかな。
C++はガイルかな。
みたいな。 自分で色々を思考できるようになってきているので、 C言語や言語の成り立ちを理解するのはすごい大事なことだ。
人体の解剖生理を学んだり、薬理学、生化学を学んだ時もこんな感じだったけど、 行き着く先があるので、そこまで行ったらOKなのだ。
そこから先は自由度が格段に上がる。
早くその領域まで進みたい。
それではまた金曜日に!