新明解 C言語中級編

C言語

目次

初めに

基本的な構文がスラスラかけなかいことやポインタ・アドレスの理解が深くないのでハンズオン的な意味合いで買いました。

メモ書きとして自分が書いたコードやためになったことを書いていきたいと思います。
※前作に当たる初級編は読了しています。

新·明解C言語 中級編 (明解シリーズ) 

新明解C言語の目次:
第 1 章 数当てゲーム
第 2 章 表示に凝ろう
第 3 章 じゃんけんゲーム
第 4 章 マスターマインド
第 5 章 記憶力トレーニング
第 6 章 カレンダー
第 7 章 右脳トレーニング
第 8 章 タイピング練習
第 9 章 ファイル処理
第10 章 英単語学習ソフト

第1章

数字当てゲームと型のサイズ確認を行いました

数字当てゲーム

put関数をつかってみたかったのと履歴をどう残して表示するのか書いてみたかったから書きました

put関数:ターミナルに文字列を出力する関数
履歴の表示は配列とfor文を使って表現してます。

※スクショ撮ったけどくそみたいな画質なってるかも

型のサイズ

型のサイズ周り自分で出力してみたかったので書いてみました

int型は想定通り1要素ごとに4byteとなっていました。

long型も測定してみようと思いましたが、64bitのPCなので8byteになると思ったがならず。

コンパイラのバージョンを確認すると、Thread model: win32と記載されていたのでこれが原因なのかな?

ちなみにchar型は1要素1byteになってました

第2章

時間を操る(clock関数)

clock関数とclock周りをハンズオンするために実施。

clock_t c1 = clock(), c2;
意味としてはclock()関数の作法みたいなもんでc1にスタート時点のclock数を記録して、c2に動き出した後のclock数を格納しているそう

printf("\r%2d", i);

"\r":キャリッジリターンcarriage return)を表す特殊文字で、カーソルを行の先頭に移動させます。これにより、行全体を上書きするように新しい文字を表示できます。例えば、以前に表示されたカウントダウンの数字が「10」だった場合、次の数字「9」をその上に表示して、前の数字を消す効果があります。これを使うことで、カウントダウンが1行で更新されているように見せることができます。
%2d:書式指定子で、2桁の整数を右揃えで表示します。2d の部分は、表示する整数が2桁以内であることを指定しています。これにより、カウントダウンの数字が1桁の時でも、2桁分のスペースを確保して表示されます(例: 9 のように、1桁の数字の前にスペースが入る)。

fflush(stdout):

標準出力(stdout)の**バッファを強制的にフラッシュ(書き込み)**するための関数です。
通常、printf はバッファリングを行い、出力を効率よくまとめてから表示します。しかしfflush(stdout) を使うことで、バッファの内容をすぐに画面に出力するよう強制します。
これがないと、バッファがいっぱいになるまで出力が画面に表示されず、カウントダウンの表示が遅れたり一気にまとめて表示されたりする可能性があります。これを使うことで、1秒ごとにきちんとカウントダウンが表示されます。

第3章

char型に文字列を入れてアドレスがどうなっているか確認。
本来はポインタ使って表現したほうが文字列の長さを気にしなくて楽だが、
2次元配列使って表現。
アドレスが6 or 1ずつずれていることを確認。

 

4章

ポインタ、アドレスの整理。

この記事
ポインタ * 、アドレス &。
変数にアドレスを入れるときにポインタ変数を使う。

int* p;
int a =3;
p = &a;
⇒printfで*pを表示するとpはaのアドレスに格納されている3を参照して表示する
printfでpを表示するとaのアドレスを表示する。

c言語では、関数の演算結果をreturn句で返そうと思うと一つしか返り値で返せないが、複数の値を返そうとしたときは関数引数のアドレスを参照して直接値を変更する方法がポピュラーな方法である。

下記の関数だとwa_sa関数で、和、差を計算しているが、main関数で呼び出されたときはwa,saの値を変更することができない。

それに対して、
下記関数であれば、wa,saの変数のアドレスを参照に値を書き換える形となる

5章

メモリ領域について学ぶ項があったので整理。

オブジェクトの記憶域期間

C言語のオブジェクトの生存期間である記憶域期間には、以下3種類がある。

自動記憶域期間
スコープ内で保管されるオブジェクト
関数内で宣言した変数、auto句をつけた変数、register句をつけた変数
これらの宣言は関数が呼び出しごとに初期化され、初期値は定義していないと不定値になる
静的記憶領域
プログラム起動から終了まで残り続けるオブジェクト
関数の外で定義された変数
関数内でstaticを使って定義された変数
割付記憶領域
プログラムの指示によって、任意のタイミングで生成され、解放される領域
calloc,malloc,reallocで確保(割付け)され、free,realloc関数によって解放される領域。

上記に合わせて、メモリの領域4つ(or5つということもある)あることを復習

参考:https://www.momoyama-usagi.com/entry/info-calc-sys13

グローバル変数や関数内のstatic変数はデータ領域に保存される
関数の内の変数や関数の引数はスタック領域に保存される
スタック領域はコンパイラによって最大何byteか決まっており、超えるとスタックオーバーフローを起こす。
その他オーバーフローには下記のようなものがあり、発生しないようそれぞれ対策する必要がある
 

最後に

もっと腰を据えてもっとアドレスや記述方法の手の内化したいところだが、時間がかかりすぎる予感がするのでいったんはある程度興味のあるところは触ったので今回はここまで。

アドレスポインタの復習やメモリ領域の話あたりは何回か見ることがあるがよくわすれがちなところ。忘れたまた見返したい。

コメント

タイトルとURLをコピーしました