Yabu.log

ITなどの雑記

C言語の復習を始めました。

こんにちは。大学の1年目のC言語の授業で予約語と非予約語の違いが判らずに 1週間くらい変数には何でもwight,hightを付けていた不届きものです。

最近C言語を再勉強することにしました。

一応大学ではC言語を一番書いていましたが、 C言語そのものの知識というのはあまり深くありません。

ちょっとした事業の数値計算の課題などで使った程度で、 (ポインタなどは積極的に避けていた)

Makeファイルを書いたり、テストを書いたり、 ということはできていませんでした。

C言語は一応読めるけど、複雑なものはわからないし、 大きな規模だったり本格的なモノづくりに活用できるようなスキル ではないということです。

これは今後hariboteOSを改築するのに大きな障害になると思ったのでC言語力を高めたいわけです。

というわけで、もう10年近くプログラミングをやっていますので、 繰り返しはfor文で書きますよ~等は説明されるとくどいような気がするので、

ある程度知っているが深く知らない、人向けの本を探してみました。

ちょうどこんなエントリが目に付いたので早速本を買ってみました。

hatomu555.hatenablog.com

早速ポインタの節の手前まで終わりました。

github.com

本書中の面白いトリビアでも書こうと思います。

charに算術演算子を使って計算することが可能

#include <stdio.h>
int main(void){
    // Your code here!
    char a =  3;
    char b = -5;

    printf("%d\n",a+b);//-2
    a +=253;
    printf("%d",a);//0 2byte overflow

}

こんなことができたなんて。

ポインタにconstをつけると中身の書き換えを防ぐことができる。

//凡例
char* p;

このconstはポインタ変数が指している領域を保護
👇
const char* const p;
              ☝️
こっちのconstはポインタ変数の値を保護

前のconstで参照先をがっちりガード。 後ろのconstで参照そのものを変更させない。

という2重ガードができる。

/**
 * const char* pで参照先の領域のみを保護する
 */
void referenceOnlyProtect(const char* p){
    p = "test"; //書き換え可能。ただし呼び出し元に影響なし。
    //ローカルスコープのvalueというポインタの値のみを書き換えている。

    //*p = 's';   //error: read-only variable is not assignable
    //この変更ができてしまうと呼び出し元の値も変わってしまう。
}

/**
 * char const *pでポインタの値のみを保護する。
 * ポインタの指す先が変更できなくなる。
 * 参照は書き換え可能
 */
void valueOnlyProtect(char* const p){
    //p = "test";//error: cannot assign to variable 'p' with const-qualified type 'char *const'
    //ポインタの値を"test"の参照で書き換えることができない。

    //*p = 't';//Bus error: 10
    //Busエラーという謎のエラーがでた。
    //🚌プップ~
    //この書き換えは本書的にはできるっぽいが。。。このエラーは謎。

}

/**
 * 参照先、参照そのものも両方保護する。
 */
void valueAndReferenceProtect(const char *const p){
    //p="test";//error: cannot assign to variable 'p' with const-qualified type 'const char *const'
    //参照の変更は許可されない

    //*p = 't';//error: read-only variable is not assignable
    //参照先の値も保護されている。
}

概念としては理解できますが、 手前のconstが参照先を保護、奥のconstがポインタのアドレス値を保護という順番が覚えられません。 多分明日には忘れています。 何かいい覚え方はないもんでしょうか。

とりあえず鬼門のポインターまで(p70)進めました。 ここはフレッシュな脳みそで読みたいの今晩はこの辺にしておきます。