4/8(水)〜16(木) の学習ログです(主にC言語)

こんにちは。(挨拶をさせて頂くと自分が流れを作りやすいので)

今日はいい天気です。快晴です。穏やかな昼下がりの東京です。(これも会話スターター的な)

僕は文章をつくることをあまり得意ではないので、練習する意味でもこの場を使わせて頂きたいと思います。

 

さて、内容ですが主に4月8日から16日にかけて学んだ学習メモです。

C言語について学んだのでそれを。

くれぐれも個人的な学習のログですので、内容についてはご容赦下さい。

 

4/8(水)

C言語について学び始める。

動機はRuby on Railsを使ってアプリ開発をしていて、ちゃんと理解したいと思い、それにはまず、Rubyをしっかり理解しようと思ったことがきっかけでした。

Rubyの再学習をはじめたら、RubyC言語で書かれていることを知り、なるほど!まずはC言語から学ばなきゃなのね!と。

ここからは箇条書きの私のメモです。


処理の最後にセミコロンを忘れるとコンパイルが通らなくなる。
コンピュータとプログラムの関係性について
CPUは処理が速く、HDDは処理が遅い、それを埋めるのがメモリ
コンピュータの中心はCPU
プログラムとは、CPUの予定表、手順書
プログラムは基本HDDにあり、実行される時はメモリ上にコピーされ、CPUで実行される
変数=メモリにつけた名前(メモリの領域の確保) ※メモリのどこに確保されるかはOSが決める
「0 b」これは2進数の意味  「o x」これは16進数の意味
式はメモリの情報を読み出して、何らかの処理をする

 

4/9(木)
制御文について
if文、for文は、1か0で動いている
switch文について

 

4/10(金)

while文
ブーリアン型、trueは1、falseは0

 

4/11(土)
for文、while文、for文のネスト
ピラミッド問題
文字について
文字は、aなど英数字1文字
1文字(char型)は1byteのメモリを使う
文字列を表現する時は、終端文字が必要になる。5文字表現するにも、終端のためのメモリのスペースが1byte分必要になるので、6byte必要。
プログラミング 上で文字はアスキーコードで扱われている。
アスキー(ascii)コードとは、0〜127を英数字一つ一つに割り当てたもの。
文字はメモリ上では数字で扱われている。

 

4/12(日)

文字列、配列、メモリの確保、ホワイトスペース、バッファーオーバーフロー、
文字列には終端文字(NULL)があって最後には必ず「0」を入力しないといけないというルールがある。
NULLはメモリ上では、0として扱われている。
文字コード、有名なのはutf-8、shift-jis英数字はasciiコードでメモリに保存される
文字列には配列を使う必要がある
文字列の最後には、終端文字(Null文字)が必要
scanf(関数)では、バッファーオーバーフロー(バグ)に注意する必要がある
日本語は文字コードによって文字化けすることがある
文字列はバグが発生しやすいので注意が必要

 

4/13(月)

関数、引数(関数に与えられる入力のこと)、returnの戻り値の型は、関数で最初に定義した型でなければならない。戻り値は、関数の出力のこと。
プロトタイプ宣言(未定義の関数が出てきても後から定義するからエラーにしないでね、という宣言。これをしないとコンパイル時にエラーとなるが、この宣言(記述)を先に行えばエラーにはならない)。
引数は関数の入力になるから、関数で定義している値と渡す値がそれぞれ異なっていても問題ないんだ!!(この表現だとちょっと分かりにくい。でもこのままw)
ある関数Aの中で定義されている変数を、別の関数Bで引数として利用しても、割り振られているメモリがそれぞれ違うので、関数Aの変数の中身は変わらない。
言い方を変えると、引数に与えた変数と、関数内の引数変数は互いに独立している(メモリが別領域)。なるほど!
戻り値(関数の出力)はreturn文を使う。auto変数(関数の実行が終わるとデータがメモリから消えてしまう変数)と
static変数(関数の実行後も残り続ける変数)について
auto変数は「auto」という修飾子が省略されている。

グローバル変数について
関数間を跨がって使える変数
関数の外に定義する
使いやすい反面、デバッグは大変。使い分けが大事。
void型 これは「何もない」を意味する型で省略できる。
method() これは、method(void) この形を省略したものだったのか。ふむふむ。


C言語を学んでいて良いと思ったことは「これどうなってるんだろ??」となることが少ないことだと思いました。あるにはありますが他の言語(Ruby,JavaScript)と比べると少なめです。

 

4/14(火)

配列と構造体
配列を使うと同じ型の変数を連続してメモリの領域に確保することができる。
構造体は異なる型の変数をひとまとまりに確保することができる。構造体もメモリに連続した領域の確保がされる。
構造体とハッシュの違いは動的か静的か。構造体が静的。つまり最初に定義した要素しか扱えない。要素の追加ができない。
配列の変数の値の初期化はfor文を使うと便利。また、sizeofを使うのがメモリを確保する良い方法。
ちなみに、int型 は 4Byte 必要。
確保したメモリより多く要素を指定すると(オーバーフロー)、読み込みはできても、書き込むとメモリの破壊になる。これは意図しない領域のメモリを壊すことになる。
オーバーフローは、OSによってエラーを出してくれる場合もあるが出してくれないとメモリは壊れる。
配列を関数に引数変数とする時は注意が必要。

構造体とは、複数の変数をひとまとまりとして扱うための技術。「struct」を使う。
構造体の要素のことを「メンバー」と呼ぶ。
文字列を代入する場合は、「strcpy」という関数を使う。これを使う時は「#include <string.h>」を事前に記述しておかないとコンパイルできない。

アライメントとサイズ
メモリのサイズ:Char 1byte 、Int 4byte
アライメントとは、整列という意味でメモリ上に変数がどうように配置されるかというもの。
メモリには番地(住所)がつけられている。
char型はどこの番地でも好きに入れられる。int型は4の倍数を先頭とする番地にしか入れることができない。これはアライメントのルール。
隙間ができたら、パディングというものがメモリ領域を埋める。そういう仕組み。
CPUとメモリの間にはデータバスという通信線がある。32CPUだったら、データバスも32bit分ある。
ちなみに、スーパーファミコンは16bitマシン、PS2は32bitマシン。へぇ!
データバスは、CPUがメモリから一度に読み書きできるデータの量を指す。
変数がアライメントを跨がってメモリの領域を確保してしまうと、一度の読み書きで、その変数にCPUがアクセスできない可能性が生じる。
つまりアライメントとは、CPUがメモリ上の変数にアクセスしやすくする仕組みのこと。

 

4/15(水)

ポインタ(変数の一種)
メモリアドレスを格納するための変数
C言語の最大の特徴
コンピュータの内部構造、特にメモリの理解が必要
ポインタの型は存在しない
ポインタを使用すると新しくメモリの領域を使わずに処理できる。つまりメモリ領域を使い回すことができる。これが最大のメリット。
関数の処理結果を返すこともできる。
Rubyにポインタはない。

C言語には「機構側は何も隠蔽しない」という原則があるのか!!
Rubyの本質は、人間の仕事を簡単にするために、できるだけ多くの作業を実行環境が肩代わりすること。
そのため実行速度は遅い。なので、シンプルで無駄のないコードを書くことで少しでも速度を上げるように心がけること。でも限界がある。そこで、処理速度を補うためにRubyには拡張ライブラリ(RubyのプログラムをCで書き直すことができる。つまり、Cの速度と同じに。めちゃ速くなる。)というものがあるのね。これはすごいわ。

 

4/16(木)

プロセス間通信について
プログラムを実行して動作させている状態をプロセスと呼ぶ。
プロセス間同士でデータのやり取りをすることをプロセス間通信という。
現場でよく使われるプロセス間通信には、以下の4つがある。
・ファイル(ファイルを介してプロセス間でデータをやり取りする方法)→デバッグがしやすい。
・共有メモリ→高速
・ソケット(ソケットと呼ばれるデータの出入口を介してデータをやりとりする)→異なるコンピュータ間で通信できる
・キュー(キューと呼ばれるデータの出入口を介してデータをやりとりする)→同じコンピュータの中でしか使えない。

TCP通信は双方向の通信ができ、通信されるデータが保障される通信方式のこと。
これはデータ送信中にデータが壊れても再送信してくれる素敵なやつ。
こういう通信方式もコードで指定できるんだ!
AWSはこれをアプリで操作できるようにしたのね。なんてやつだ!

プロセス間通信を学び終えて、C言語は一旦終了。
なかなか学びが多くて楽しかったです。また少ししたらC言語へ戻ってこようと思います。
次は、C++も学んでみたいです。

 

学習教材

Udemy

5日で身に付く基礎知識ゼロからのC言語

Zico G