6/9(火)〜11(木) の学習ログです(主にC言語)

こんばんは、いつもありがとうございます。

梅雨入りしましたね。

 

0→1を生み出すには、MP(マジックポイント)を大量に使うのだと分かった安藤です(自分の世界観)。

入れまでは、HPがあれば、ある程度のことができたのですが、最近はMPが消耗しすぎてて。

一晩寝る以外に回復の方法が見つからないので、模索し続けたいと思います。

 

ちょっと訳が分からないかもしれませんが、そんな時もあります。

ちなみに内容にはかなり自信があります!笑

 

さて、学習ログです。

 

 

2020.6.9(火) 

C言語(web記事「苦しんで覚えるC言語」)
●複数の型をまとめる
・構造体の使い方
構造体変数は、元となった構造体タグで宣言されていた全ての型を持っている。
配列の時には、同じ型の変数を番号によって区別していたが、
構造体変数では、型に関係なく全ての要素を名前によって区別する。

構造体変数の持つ1つの要素にアクセスするには、次のようにする。
構造体変数名.要素名

ここで、「.」とは小数点記号のこと。
このようにして個々の要素にアクセスすることができる。

構造体は、構造体変数自体を変数として取り扱うことができる。
例えば、構造体変数同士で、代入を行うことが可能。

構造体変数の比較や演算はできない。

構造体タグを、新しい型として1度に宣言してしまう方法がある。
C言語では、新しい型を宣言するtypedefが用意されている。

typedef 新しい型の形 新しい型名

 

 

◎読書「王様達ヴァインキング」
読了ーー!!!最高でした。

 

 

2020.6.10(水) 
C言語(web記事「苦しんで覚えるC言語」)
●複数の型をまとめる
・構造体の引数

・構造体で情報を渡す
構造体はそれ自体が1つの変数として扱われます。
従って、構造体型の引数を使うことができ、1度に複数の情報を渡すことができる。
構造体型の引数も、通常の引数のように指定することができる。
ただし、typedefで宣言していない場合は、structをタグ名の前につける必要がある。

配列の時は、引数にしても、渡されるのは、先頭のアドレスだけだったけど、
構造体型の引数は、受け取る側の関数に全ての値がコピーされる。
従って、受け取る側の関数で引数の中身ウィ変更しても元の構造体変数位は影響しない。
呼び出し側でも通常の変数と同じ方法で呼び出すことができる。

・構造体の中の配列
構造体の中に配列が含まれている場合は、配列の中身もコピーされて渡される。
従って、中身を変更しても、呼び出し元の変数には影響しない。
配列をコピーして渡したい時には、構造体にしてしまうのが簡単な方法。

 

 

◎読書「自分の中に毒を持て」岡本太郎さん著
岡本太郎さん、かっこええっす!

 

 

2020.6.11(木) 
C言語(web記事「苦しんで覚えるC言語」)
●複数の型をまとめる
・構造体でもポインタ変数
構造体型のポインタ変数を作ることができる。宣言方法は同じ。
構造体の各要素は、宣言時の順番通りに並んでおり、&演算子で求められるアドレスは、構造体のはじめの要素のアドレス。
構造体のポインタ変数の場合も、*記号で通常変数モードに切り替えることができる。
ただし、.の方が優先されるので、カッコをつけること。
(*構造体ポインタ変数名).要素名

ただ、(*)をつけるのは面倒なので、次の書き方で代用できるようにしているってよ。
構造体ポインタ変数名->要素名

・構造体でもポインタ引数
構造体型へのポインタ型の引数を持つ関数を作ることができる。

普通に渡すことができる構造体を、ポインタ変数として渡す理由の1つ目は、
普通のポインタ変数と同じく、関数内で値を変更できるようにするため。
2つ目は、関数呼び出しの高速化のため。
構造体を渡す時、その中身は全てコピーされる。構造体の中に大きな配列があれば、その中身まで丸ごとコピーされる。
当然これはそれなりの時間を処理に要する。
しかし、ポインタのアドレスを渡すだけなら、ほとんど時間はかからない。

一般的には、構造体はポインタ変数を使って受け渡しすることが多いよう。

 

 

 

今回は以上です。

今後生まれるアイディアはきっとやばいヤツだと思います。

産みの苦しみですが、頑張っていこうと思います。

 

それではまた! 

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!という世界観だ。

結局、最後は機械語に翻訳されて動くのだからね。

 

リュウRubyかな。

ケンはPythonかな。

C++はガイルかな。

みたいな。 自分で色々を思考できるようになってきているので、 C言語や言語の成り立ちを理解するのはすごい大事なことだ。

人体の解剖生理を学んだり、薬理学、生化学を学んだ時もこんな感じだったけど、 行き着く先があるので、そこまで行ったらOKなのだ。

そこから先は自由度が格段に上がる。

早くその領域まで進みたい。

 

それではまた金曜日に!

6/2(火)〜4(木) の学習ログです(主にC言語)

こんにちは。

いつもありがとうございます。

 

自分の未熟さによって人の面子を立てられなかった時に、

自分の未熟さを憂うよりも、まず先に相手や周りのことを考えて悩める人間になりたい安藤です。

つまりは、そんな時も失敗自分に目が向いてしまうわけです。

文字通り足りない人間なので修行中です。死ぬまで修行です。

 

けれども、反省も大切なことだけど、そこに執われていては自分中心ヤローのままになってしまうので、失敗した分、誰かに喜んでもらえるように今日も頑張っていきたい思います。

 

こんな回もあります。笑

このようなことも私の人間性の一部分なので恥ずかしいけど載せてみました。

 

 

ということで、学習ログを残していきます。

 

 

 

2020.6.2(火) 

C言語(web記事「苦しんで覚えるC言語」)
●ポインタ変数の仕組み
・モードの切り替え
ポインタ変数は2つのモードがあり、何も指定せずにポインタ変数を使っている場合は、ポインタ変数モードになる。
通常変数モードに切り替えるには、変数の前に*記号をつける。
*記号がついたポインタ変数は通常変数と全く同じ機能になる。

通常変数モードに切り替わったポインタ変数は通常の変数と同じように機能するが、
その時に使われるメモリはポインタ変数モードの時に代入されたアドレス。
つまり、ポインタ変数モードの時に読み書きしたいメモリのアドレスを代入して、その後、
通常変数モードに切り替えてそのメモリを操作する。
というのがポインタ変数の最も基本的な使い方。

直接、何番のメモリを書き換えろ、と指定するのではなくて、
書き換えたいメモリのアドレスを代入し、モードを切り替えて書き換える、という
2段階になっている。なので直感的には分かりにくい。

「*」記号は、3通りの意味を持っている。
1つ目は、乗算演算子
2つ目は、間接参照演算子。ポインタ変数を通常変数モードにする。
3つ目は、ポインタ変数を宣言する時に使用する。

通常変数モードに切り替える間接参照演算子と、宣言時に使用する*は何の関係もない全く別の記号。
この3つには全て別の文字を使う方が分かりやすいはず。同じ文字を割り当てているのは、C言語の欠陥の1つ。

ポインタの本当の使い方は、ショートカットとして使用する。
デスクトップに並んでいる、あのショートカットと同じ。
ショートカットは指し示すファイル自体ではないので、ショートカットはどこにでも自由に作ることができる。複数作ったり、削除しても指し示すファイル自体には影響はない。

これこそがポインタの役割そのもの。
そのポインタ変数が使える場所であれば、元の変数が使えない場所であっても、ポインタ変数を通常変数モードに切り替えれば、元の変数と同じように使うことができる。
まさにショートカットのような働きをさせることができるわけ。

一般的にポインタは、C言語C++のみの機能と言われている。
指定したメモリのアドレスを操作するという意味ではその通り。

しかし、ポインタの本当の使い方はショートカットとして使うことなので、その観点では、実用的な言語のほとんどにポインタはある。
Javaの「参照」はまさにそんな機能で、しかも頻繁に使われるし、
Visual BasicのSETステートメントなども同様の機能。

そもそもポインタがないのでは、連結や木構造などの複雑なデータ構造を実現できないし、オブジェクト指向も困難。
その意味では、仕組みが不明なJavaVisual Basicのポインタより仕組みがはっきりしているC言語のポインタの方が理解しやすい。

他の言語の参照と、C言語のポインタの最大の違いは、自動なのか、手動なのか、ということ。
他の言語の参照はほとんど自動でショートカットとして機能するようになっているが、C言語のポインタは完全に手動で、プログラマが完全に理解した上で使わなければならない。
ただ、上級者がC言語のポインタを使いこなすとポインタだけで、ほぼあらゆる制御構造、あらゆるデータ構造を実現できる強力な機能となる。
実際、C言語の様々な機能ってほとんどポインタで成り立っていると言っても過言ではないらしい。


◎読書「王様達ヴァインキング」より
ランサムウェア
PC内のデータを暗号化、使用不能にして「人質」にする不正プログラム。
データ復旧と引き換えに「身代金」を要求する。

 

 

2020.6.3(水) 
C言語(web記事「苦しんで覚えるC言語」)
●ポインタ変数の仕組み
引数による情報の受け渡し

・ポインタ型の引数
C言語では、関数へ情報を渡す場合、元の変数の値のコピーを渡す。
この方法のことを「値渡し」と呼び、元の変数の値が変更されないことが特徴。
ポインタ型の引数であっても、値のコピーが渡される。

ポインタ型を使うのは、ポインタ型はアドレスを受け取ることができるから。
関数を呼び出す時に、既に存在する変数のアドレスを指定すると、関数で受け取ったアドレスをポインタ変数に代入すれば、あとはポインタ変数を通常変数モードに切り替えて、返ってきた情報が代入される。
返された情報は呼び出し側で指定した変数に記憶されていることになる。

ポインタ変数にアドレス値が代入されている場合には、通常変数モードに切り替えてそのメモリを自由に読み書きできるのだから、結果として、呼び出された関数から呼び出し元の変数の中身を書き換えることができる。

&付きで呼び出していた関数は全て同様の仕組み。
C言語では、この使い方が最もポピュラー。



 

2020.6.4(木) 

C言語(web記事「苦しんで覚えるC言語」)
●ポインタ変数の仕組み
引数による情報の受け渡し

・配列型の引数
配列を渡すのではなく、配列の先頭のアドレスを渡している。
配列の先頭のアドレスを渡すので、要素数は全く関係ない。
呼び出された関数における配列は、呼び出し元と同じメモリ領域を指すことになるので、呼び出された関数で配列の値を変えると呼び出し元も変更される。

・配列のような使い方
  [ ]  は、配列の要素番号を指定する演算子
その仕組みは、配列名というアドレスに足し算を行なっているだけ。
つまり、配列でなくても、アドレス値なら何でも良いということ。

数式の中に配列名を記述した場合、 [ ] の記号の有無に関わらず、
配列名は、配列の先頭要素へのアドレス(ポインタ値)として扱われる。
そして、その配列名に[ ] をつけた場合、そのアドレスに番号の値だけ足し算を行い、
その結果として、足し算された分の番号の要素として扱われる。

・宣言時と数式との違い
配列を宣言する時には、[ ] で要素数を指定し、配列の要素を使う時は、 [ ] で番号を指定するのですが、実はこの2つは全く別の記号。
宣言時の[ ] は要素数を指定するという意味を持つが、
数式の中で使う [ ] はアドレスに足し算する演算子
C言語では、似た使い方には、同じ記号を使いたがる傾向があり、そのため異なる意味に同じ記号を割り当てている部分が多いみたいっす。
このことから、使えるメモリならばポインタ変数を配列のように使えることが分かる。

・配列とポインタは全く別物
配列とは、多数の変数を順番をつけて、まとめて扱う方法であり、
ポインタとは、変数のショートカットを作る方法。
それなのに似たような使い方ができるのは、配列の設計と関係がある。
それは、C言語では配列を実現する手段としてポインタを利用しているから。
従って、ポインタ変数では、配列と同等のことができてしまう。
そのため、配列とポインタは混同しやすい。

配列はあくまで多数の変数の先頭を示す固定された変数であり、
ポインタ変数は好きな変数のアドレスを代入して、好きなメモリ領域を使うことができる可変的な変数。

 

 

 

今回はこれで以上です。

最近学習に割り当てる時間が少ないので、もっと頑張りたいです。

とは言っても、できる時はできるし、できない時はできないし、仕方がないこともたくさんあるので、気負わず緩まず継続して、少しでもコツコツやっていきます。

 

あ、あと、C言語動的言語の仕組みを知るにはすごい良い教材だと思います。

 

それでは、また来週の火曜日に!

 

 

5/29(金)〜6/1(月) の学習ログです(主にC言語)

こんにちは。

いつもありがとうございます。

 

プログラミングを学び自分のアジェンダについて考えていたら、アートについての理解が進んだ安藤です。

アートの理解が進んだことで、自分の発想が拡張され、これからのライフワークにも関わってきそうでワクワクしています。

 

さて、今回も学習ログを残していきたいと思います。

 

 

 

2020.5.29(金) 

◎「中学生から始める983m式言語超入門」(Udemy)
セミコロン;は、「セパレータ」と言って、各値を分離するもの。

 

C言語(web記事「苦しんで覚えるC言語」)
●変数とメモリの関係
・配列の番号
実は配列名は、配列の最初の要素のアドレスを表していた。
各要素を参照する時に、[0],[1]と要素番号をつけるが、この意味は、
配列名のアドレス+要素番号のメモリを参照するという意味。
つまり、最初のアドレスを決めておけば、それに番号を足し算知りことで、
たくさんの変数が並んでいるという状態を表現することができる。

 

◎読書「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」

 

◎読書「王様達ヴァインキング」

 

 

2020.5.30(土) 
C言語(web記事「苦しんで覚えるC言語」)
●ポインタ変数の仕組み
・ &つけが必要な変数の正体
「&」は変数のアドレスを求める演算子
演算子を使うと、その変数のメモリ上の番号を知ることができる。

・全ては値渡しである
値渡しとは、関数に単なる数値として情報を渡す方法。
変数を実引数に指定しても渡されるのは中身の数値。
変数の中身を関数の戻り値として渡される値に変更したい場合もあるので、
演算子を使って変数のアドレスを求めて、そのアドレスに戻り値の数値を渡す。
そうすれば、関数に呼び出し側のアドレス、即ちメモリ上の番号が伝わり、その番号のメモリの数値を書き換えれば、呼び出し側の変数の値も書き換えられるというわけ。
これが変数のアドレスを知る必要がある理由。

・scanf関数で&をつける理由
関数には変数に記憶された値のコピーしか渡すことができない。
これでは変数に新たな値を記憶させることはできない。
その場合も変数のアドレスを数値として渡してやれば関数側はそのアドレスにデータを渡すことができ、記憶することができる。
これが、scanf関数で変数に&をつける理由。

配列名には&をつけなくていいのは、配列名は配列の最初の要素がアドレス示しているから。なので配列名を渡すということはアドレスも一緒に渡していることになる。

◎読書「王様達ヴァインキング」

 

 

2020.5.31(日) 
C言語(web記事「苦しんで覚えるC言語」)
●アドレスを記憶する変数
・ポインタという単語
ポインタという呼び方は、総称であり、正確には3種類に分かれている。
①ポインタ型
int型やdouble型と同じような型。
②ポインタ値
アドレスのこと。
③ポインタ変数
ポインタ型で宣言されたポインタた値を記憶できる変数のこと。

・ポインタ型
ポインタ型とはアドレスを記憶する変数の型のことを意味している。
通常の型とは異なる特性がある。
それは、他の型から作り出される派生型であるということ。
例えば、int型の場合は独立した型。他の型とは何の関係もない。
けれどもポインタ型は、他の型とポインタ型を合体させて作る。

int型とポインタ型を合体させると、intへのポインタ型という型ができる。
double型の場合なら、doubleへのポインタ型が作られる。
また、intへのポインタ型に更にポインタ型を合体させて、intへのポインタのポインタ型という多重のポインタ型を作ることもある。

要するにポインタ型は、他の型と合体しなければ存在できない寄生虫のような型。

えー、ポインタ型はアドレスを記憶する変数の型。
アドレスは整数値に過ぎない。
では、なぜ整数値を記憶する型が他の型と合体する必要があるのか…。
その理由は、指定アドレスに記憶された数値を取り出すため。

例えば、int型、double型、char型は、全てサイズが違っている。
int型の場合、標準的なコンパイラでは4バイトのサイズ、億単位で存在するメモリというロッカーの4個分を使っていることになる。
int型の値を取り出すには、この4個をまとめて取り出さないといけない。

型によっては、メモリに記憶された2進数の読み方まで違ってくることもあるから、
元々の型が何だったかが分からない限り、記憶された数値を取り出せないわけ。

つまり、ポインタ型はどんな型の変数のアドレスだったか分かる必要がある。
そこで、予め他の変数と合体した形でポインタ型として作っておけば、そのポインタ型の変数に記憶された数値は、すぐに分かるというわけ。

・voidポインタ
単独に存在するポインタ型としてvoid型がある。
この型は、どんな変数のアドレスでも記憶することができるけど、元々の変数の型が分からないので、値を取り出すことはできない。

・ポインタ値
ポインタ値とは、ポインタ型の変数が記憶できる数値のこと、要するに、変数のアドレスの値のこと。

C言語の先祖であるB言語では、C言語のint型にあたる型にアドレスを記憶する仕組みだった。

C言語で、ポインタ値という数値で扱われている理由は、その目的の違いから。
通常の整数値は、プログラムの中で計算などを行うための数値。
ポインタ値は、計算に使う数値ではない。
なので、変数に記憶されている数値が、整数値なのか、ポインタ値なのかを区別しやすくするために、int型とポインタ型に分かれた。

・ポインタ変数
ポインタ型で宣言された実際の変数のこと。
この変数には、その元となった型の変数のアドレスを自由に代入できる。
更に記憶しているアドレスのメモリを読んだり書き換えたりすることができる。

他の変数とは性質が異なっている。他の変数はどんな値を記憶するにせよ、何らかの計算に使うことが目的だった。
文字型のcharですら、その実態は文字番号であり、どの文字を表しているのかを計算するための実数。
しかし、ポインタ変数では記憶しているアドレス値を計算に使うことはない。
ポインタ変数の役割は、それが示しているアドレス番号のメモリの値を計算すること。
ポインタ変数そのものを計算に使うのではなく、それが示している変数を計算するのが目的。

普段は、ポインタ変数として振舞っているんだけど、その変数の計算が必要になった時には、普通の変数に変身して計算に対応するというわけ。

この変身機能こそがポインタ変数の最大の特徴。
ポインタ変数は、ポインタ変数モードと通常変数モードの2つもモードを持っている。
必要に応じてそれぞれ切り替えて機能している。

 

 

 

2020.6.1(月) 
C言語(web記事「苦しんで覚えるC言語」)
●ポインタ変数の仕組み
・ポインタ変数の宣言
「*」はポインタ型を意味する。
変数の前に「*」がついていれば、ポインタ変数を宣言できる。

・アドレスを代入する
仮想メモリ
OSがメモリを管理して、多数のアプリケーションに適切にメモリを振り分けること。
多数のアプリケーションが同時に動く環境で、個々のアプリケーションが勝手気ままにメモリを使うと、別々のアプリケーションが使うメモリが重なってしまい正常に動作しなくなる。
そのため、OSが個々のアプリケーションが使うメモリが重ならないように管理している。

正常に管理されたアドレス番号を代入する確実な方法は、
もう1つ別の変数を宣言し、そのアドレスを代入する方法。
宣言された変数はOSによって管理されたメモリ領域に作られているため問題なく使うことができる。

・ヌルポインタ
ポインタ変数も宣言した直後はデタラメな値が代入されている。
その値が使用可能なアドレスかどうかは分からないので、そのアドレスを使うとバグになる。
これを防ぐにはアドレスを代入したか区別する必要がある。
そこでC言語には、ヌルポインタが用意されている。
NULLという記号をポインタ変数に代入しておけば使える状態でないことを示せる。
int *p = NULL;

int *p = 0;としてもヌルポインタが代入される。
これはC言語の文法として決まっていることであり、NULLが0であるということではない。
NULLは正しいアドレスが代入されていないことを示すための識別用の値であり、計算に使うための数値である0とは明確に区別されている。

 

 

今回はこれで以上です。

次回は金曜日に!

それではまた!

 

 

 

5/26(火)〜28(木) の学習ログです(主にC言語)

おはようございます、安藤です。

 最近、朝型に生活のリズムをシフトしたのですが、早起きするだけで嬉しいです。

なんか気分が良いです。

よく分からないけど、昼や夕方に起床した時にこのように気持ちにはならないので、朝型はそれでけで素晴らしいです。

 

話は変わりまして、

はてなブログのページですが、SSLに対応して欲しいなと思います。

https」鍵付きのやつね。

保護されていない通信」って表示されているのは辛いです。

トップページは対応しているのに…なぜ!!!

 

さて、今回も学習ログを残していきます。

 

 

 

2020.5.26(火) 
C言語(web記事「苦しんで覚えるC言語」)
●文字列処理関数
・文字列の入力
数値と同様、文字列を入力する場合にもscanf関数を使うことができる。
文字列を入力する場合、scanf関数で%s指定子を指定する。
配列名の前に&はつけない。
注意点
①配列の要素数よりも多く入力すると暴走する。
この問題を解決するには、文字配列の要素数を%とsの間に指定する。
例えば、要素数が32なら、「%32s」と指定する。それ以上の文字は切り捨てられる。
これにより暴走は起こらない。
②この方法では、スペースを入力することができない。
これは、スペースが区切り記号として認識されるから。
これは解決できない。

・文字数を数える
文字配列の先頭からEOSが出現するまでの数を数えるだけ。
for文で、配列要素の中にEOSが出現するまで変数iをひたすら増加させるだけ。
ただ、少し面倒なので文字列の文字数を数えるstrlen関数というものがあるの。
strlen関数を使うには、string.hを#includeする必要がある。

変数=strlen(文字配列);

・文字列の比較
文字配列同士の比較では、==演算子を使うことはできない。
文字配列の中身を比較するには、for文で全要素を比較する必要がある。
文字列の比較ではEOSまでが同じでなければならないので、比較元よりも1文字大きく比較する。

C言語には、文字列を比較するstrcmp関数というものが用意されている。
使用する時は、string.hを#includeすること。

変数=strcmp(文字列1,文字列2);

この関数は、2つの文字配列の中身が同じなら、0を返す。

 

 

 

2020.5.27(水) 

C言語(web記事「苦しんで覚えるC言語」)
●メモリの仕組み
CMOS(シーモス Complementary MOS;相補型MOS)とは、
P型とN型のMOSFETをデジタル回路(論理回路)の論理ゲート等で相補的に利用する回路方式(論理方式)、及びそのような電子回路やICのことである。

・超巨大な1列ロッカー
メモリの中には多くの電子部品が組み込まれていて、その一つ一つが自分自身の状態を持っている。状態とは、オン、オフということ。

電子部品の状態がオンならば1、オフならば0というように、それぞれの部品が、1であるか、0であるかを記憶している。

これは超巨大な1列のロッカーのような構造に例えられる。
メモリが64MBのコンピュータならば、5億個以上のロッカーが並んでいる。
そして、そのロッカーには番号が付けられている。
また、1つ1つのロッカーは荷物という状態を持っている。
荷物が入っていたら1、入っていなかったら0としてカウントする。

コンピュータは、このロッカーに荷物を詰め込んで、数値を記憶する。
全ての数値は、1と0の組み合わせで記憶される。
要するに、コンピュータは数値を2進数で記憶している。

・CPUのビット数
CPUが1回で扱うメモリの2進数での桁数がビット数。
1ビットとは、2進数1桁のことを意味している。

・32ビットのロッカー
32個をひとまとめにして扱うコンピュータを32ビットコンピュータと呼ぶ。
つまり、超巨大な1列ロッカーは32個ずつ仕分けして使えばいい。
でも現実は8個ずつに仕分けされていて、それぞれに番号が付けられている。
8個ずつにデータを区分けするとは、メモリを8ビット単位で取り扱うということ。

8ビットは1バイトと呼ばれていて、コンピュータの基本的な単位となっている。
これは、色々なデータを扱う上で8ビットは都合が良いから。
8ビットで0〜255の数値を表せるので、比較的小さな数値の記憶には最適。
また、2進数で動作するコンピュータには、8ビットはキリのいい桁でもある。

このような事情から実際のコンピュータでのメモリの取り扱いは、ロッカーを8個ずつにまとめて、8個を1単位として番号を割り当てている。
32ビットコンピュータでは、これに32ビットの範囲内で番号が割り当てられている。
10進数で約42億番までの数値を扱うことができる。

 

 

2020.5.28(木) 

C言語(web記事「苦しんで覚えるC言語」)
●変数とメモリの関係
変数はメモリ上に存在する
ポインタという概念を理解するためには、変数がどのようにメモリに格納されているのかを知っておく必要がある。

プログラムで宣言した変数もメモリに番号つきで記憶されている。
ただ、番号で区別するのと分かりにくいから名前をつけているわけ。
実行ファイルにコンパイルすると変数名は番号に変換される。

つまり、全ての変数はメモリに作られていて、
そこでは番号をつけて区別しているということ。

✳︎C言語は、デニス・リッチーという人が自分たちで使うためだけに作ったプログラミング言語。なので、世界中の人々のことを考えて設計されていないし、自分達の都合の良いように作ったのでクセみたいなものがある。
そりゃそうだよね、と。

小さな部品からプレステのゲームに至るまで幅広く使われている。
すげーっす。

・メモリ上の番号を表示する
変数に付けられた番号は、printf関数で%p指定子を使って調べることができる。
変数の前に&をつける必要がある。

メモリ上で変数に付けられた番号のことを「アドレス」と呼ぶ。


◎読書「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
●多重継承の問題点3つ
・構成の複雑化
あるクラスのスーパークラス、そのまたスーパークラス、そのまたスーパークラスと複数のスーパークラスがあり、関係が複雑になってしまう。
・優先順位
複雑な関係を持つスーパークラスがあるということはクラス群の優先順位が一目で分からないということ。
・機能の衝突
複数のスーパークラスからメソッドを引き継ぐと、受け継いだメソッドが衝突することがある。同じ名前のメソッドがあった場合にどちらが有効になるのか、一意に定めることができない。

「制約された多重継承」とでも呼ぶべき機能が、
Javaなら、インターフェース、
LispRubyにおける、Mix-in。

 

 

今週は朝型に変えて色々生活が変わりました。

生活のデザインを見直すことって本当に大切だと思いました。

これからも生活について丁寧に考えていきたいです。

 

それでは、また来週!

 

 

5/22(金)〜25(月) の学習ログです(主にC言語)

こんばんは、というか深夜ですね。

いつもありがとうございます、安藤です。

 

24日から生活のスタイルを太陽に合わせようと舵を切りました。

まだ実験段階ですが、まだ馴染まず…(そりゃそうだ)

地道に進めていこうと思っています。

長年の習慣を変えるのは大変だと思いますが、どんな結果になるかを楽しみに挑戦していこうと思います。

 

 朝の散歩は気持ちいいです。睡眠の質も良くなってる気がします。

身体の声を傾聴していきます。

さて、今回もここに学習のログを残します。

 

 

2020.5.22(金) 

C言語(web記事「苦しんで覚えるC言語」)
●文字列を扱う方法
・配列にしてしまう
文字変数の配列を作れば文字列になる。C言語では、文字列の最後に特別な値を記録しておくことで文字数を判定する。
このような文字を「EOS」と呼ぶ。
「‘\0’」がEOSとして扱われる。数値そしては、0にあたる。
EOSは、文字列の終わりを表す記号で、終端文字とも呼ばれる。
End of Stringの頭文字。printf関数では、%s指定子を使って文字列の表示ができる。
EOSを書いた場合は要素数を省略することができる。・文字列の初期化
「” “」で囲んだ文字列を「文字列リテラル」と呼ぶことがある。
文字列リテラルを使うと簡単に文字列の初期化ができる。

# include <stdio.h>

int main(void)
{
 char str[ ]=“MARIO”;
 printf(“%s\“, str);
 return 0;
}

実行結果  「 MARIO 」

 

この方法では、文字列を普通に書くだけでよく、要素数を省略することもできる。
この場合は、要素数は文字列の長さより1つ多く確保されるが、
多めに領域を確保したい場合には、指定することができる。
この方法の問題点は、初期化の時にしか使えないこと。
後から文字列を代入したい場合には、1つ1つ要素に代入するしかない。

int main(void) {
 char str[6];
 str[0]=‘M’;
 str[1]=‘A’;
 str[2]=‘R’;
 str[3]=‘I’;
 str[4]=‘O’;
 str[5]=‘\0’;
 printf(“%s\n”,str);
 return 0;
}

実行結果  「 MARIO 」

 

 

2020.5.23(土) 

今日は全然学習出来なかったです。
夕方に散歩をしたら、なんか身体が喜んでいる感じがしたので続けてみようと思います。
太陽と運動が圧倒的に不足してる。。。

一周回って自己管理ができていない状態に陥っているので、生活を整えることに意識を向けていきたいと思います。

 

 

2020.5.24(日) 
 
C言語(web記事「苦しんで覚えるC言語」)
●文字列処理関数
数値への変換
 
atoi関数は、文字列を数値に変換した結果を代入する。
atoi関数を使うには、sodlib.hを#includeする必要がある。
 
変数=atoi(文字列配列名);
 
atoi関数では、+-のついた符号付きの数字も変換できる。
もし、数字とは関係ない文字列が指定された場合は、0に変換される。
実数に変換する場合には、atoi関数を使用する。
 
 
 
 
2020.5.25(月) 
C言語(web記事「苦しんで覚えるC言語」)
●文字列処理関数
文字列のコピー
strcpy関数を使うと、文字列のコピーを行うことができる。
strcpy関数を使うには、string.hを#includeする必要がある。strcpy(コピー先文字列配列名,コピー元文字列配列名);この関数は、文字列配列同士のコピーに使うのが元々の役割だったが、
実際には、文字列の代入に使われることが多い。先頭から指定された文字数だけをコピーするstrncpy関数もある。strncpy(コピー先文字列配列名,コピー元文字列配列名,コピーする文字数);
コピー先文字列配列名[コピーする文字数]=‘\0’;この関数は、文字数の分だけコピーするので、コピーされた文字列の最後にEOSが入っていないことがある。
そのまま表示させる延々と表示され続けてしまうので、必ずEOSをつけること。・文字列の連結
strcat関数
使用するには、string.hを#includeする必要がある。
strcat(元の文字列が記憶された配列,追加する文字列の記憶された配列);・究極の文字列合成関数
この関数はあらゆる文字列合成に使用できる万能関数。
sprintf関数は、printf関数と同じ機能を持った関数だが、
sprintf関数の場合、結果を配列の中に記憶する。
sprintf関数を使うには、stdio.hを#includeする必要がある。sprintf(結果を記憶する配列,書式文字列,各種変数…);

 

 

今回は以上です。

太陽はとっくに沈んでいるので私も眠りにつこうと思います。

 

次回は金曜日に更新予定です。

では、また!

5/19(火)〜21(木) の学習ログです(主にC言語)

こんばんは、安藤です。

いつもありがとうございます。

今回も深夜の更新となってしまいました。

 

自粛が少し解除(意味としては緩和だよね)に向かう中に、今になって海外ドラマに興味が出始めてて、なんとういうタイミングだ!!と思う今日この頃です。

やりたいことが山積みなので、どこかで1度「やりたいことの断捨離」をしなきゃかもと思っています。 

 

さて、今日も学習ログを残していきます。 

今回から漫画「王様達ヴァインキング」からの学びも載せていきます。

こちらの漫画、マジやべーっす。最高です(o^^o)

 

 

2020.5.19(火) 

C言語(web記事「苦しんで覚えるC言語」)
●配列
配列とは、同じ型の変数を複数宣言し、番号によって管理することで、複数のデータを一括りにして取り扱えるようにする仕組み。
配列として宣言された変数は、1つ1つが番号によって区別される。
番号を適当に切り替えながら使うことで、100個でも1000個でも大量の変数を同じように使うことがきる。

●配列の宣言
型名 配列名[要素数];
Int array[100];

型名とは、変数の型と同じ。
配列名とは、配列全体の名前のこと。
要素とは、作られる変数の数のこと。ここで指定した数だけ指定した型の変数が作られる。
ここで数として指定できるのは整数値のみ。

配列の取り扱いは、配列名に番号をつけることを除けば変数と同じ。
番号は0番から始まる。

 

◎王様達ヴァインキングより
ファイアーウォールのことなど、セキュリティの凄腕の人の凄さを感じれて楽しい。
ウィルスは機械語で人には読めないようになっているのか。ふむふむ。

 

 

2020.5.20(水) 

C言語(web記事「苦しんで覚えるC言語」)
●配列の使い方
配列も変数と同じように宣言と同時に初期化することができる。
型名 配列名[要素数]={0番の数値,1番の数値,2番目の数値,・・・};

{ }で囲んだ中に順番を区切って数値を並べる。
全てを指定する必要はないので、数値の個数は配列の要素数以下にする。
配列の要素数よりも少ない場合、残りには全て0が代入される。

・全要素の表示
配列の全ての要素を表示するために、for文のループを使うことができる。
このような使い方ができることこそ配列の最大の利点。

・要素数を求める
C言語には、変数や配列のサイズを求める「sizeof(サイズオブ)」演算子がある。
sizeof(変数や配列名)

sizeofには、( )をつけてもつかなくてもよい。

●memcpy関数
memcpy関数を使うと、for文を使わずにコピーができる。
memcpy(コピー先配列名,コピー元配列名,配列全体のサイズ)

memcpy関数を使う場合は、
#inclide <memory.h>
この記述が必要。

 

 

◎読書「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
「継承」とは、似た部分をくくり出す仕掛け。
具体的には、継承はあるクラスの性質を受け継いだ新しいクラスを作る機能。
元になったクラスのことを「スーパークラス」、新しく作られたクラスを「サブクラス」という。
サブクラスは、スーパークラスの全てを受け継いでいるし、新しいメソッドも追加できる。
既存のクラスを利用して新しいクラスを作り出すことを「差分プログラミング」

抽象化によって共通部分をスーパークラスとしてくくり出すことと、既存のクラスを利用して新しいクラスを作ることは同じ手法の両面のようなもので、前者をボトムアップ・アプローチ、後者をトプダウン・アプローチという。

Rubyをはじめ多くの言語では1つのクラスに対して、1つのスーパークラスが決まる。このような継承を「単純継承」と呼ぶ。

C++Lispなど複数のスーパークラスを持つことができる言語もたくさんある。
そのような継承を「多重継承」と呼ぶ。

JavaScriptは、継承のない言語。

ブラックボックスの例として電卓がある。
キー入力後、計算結果が液晶に表示されるが、内部の処理は分からない。もしかしたら小人がそろばんをはじいているかも!

 

 

 

2020.5.21(木) 

C言語(web記事「苦しんで覚えるC言語」)
●文字の扱い方
文字列を扱う変数
C言語には、文字列を記録する変数がないのよ。
文字列用の変数がないのは、文字列が特殊な性質を持つため。
文字列は事前に何文字になるのか予想できない。つまり必要とされるメモリのサイズが分からない。
このような事情からC言語には文字列用の変数がない。

C言語以外の多くの言語は、文字列変数を用意している。
①メモリを固定的に確保(文字列が制限される上、メモリが無駄になる)
古いBASICやPASCAL
②メモリを可変的に確保(速度が遅くなる)
Javaなど。C++にも似た機能がある。

C言語プログラマーが自由な方法を選べるので柔軟。

・文字を扱うには
文字列変数はないが、文字変数はある。
文字は必ず1文字なので、変数で扱うことができる。

C言語では、文字変数として、「char(キャラ)型」が用意されている。
char型の変数には、1文字を記録しておくことができる。
文字は「” “」で囲うことで表現する。

%c指定子を使えば、printf関数で表示することができる。

・全角文字はNG
char型で記憶できる文字の種類は最大で255種類が限界。
この問題を解決する手段として、「wchar_t型」がある。

文字コード
コンピュータで使われる文字に1対1で対応する番号をつけて表現する方法。
ASCIIコードという規格では半角のアルファベットや記号が割り当てられている。
日本語を扱えるコードとして、JIS、シフトJISEUCが使われている、世界中の言語を扱えるコードとして、Unicodeが普及している。

char型変数に文字を代入するのは、文字コードの番号を代入しているだけ。
つまり、普通の整数型と同じ。

ということで、コンピュータでは全ての文字は番号で表示されており、char型はその番号を記録しておくに過ぎないということ。

 

 

◎読書「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
単一継承はスーパークラスを1つしか持てない。現実では人は会社員であると同時に父親であったり、プログラマであると同時にライターであったりする。

多重継承の優れた特徴2つ
・単一継承の自然な拡張
・複数のクラスから機能を取り込むことができる

多重継承は単一継承ができることなら何でも実現できる。しかし、クラスの関係が複雑になりがちという欠点がある。

 

 

今回はこれで以上です。

どんなことも覚悟を定めて、できることをコツコツ継続していく。

不平不満は燃料にして謙虚に自分のできることに集中する。

自分のことも周りのことも大切にする。

人の話に耳を傾けて寄り添っていく。自分の意見は相手のことを聞いた後に。

 

人生が動く時って必ず周りの人たちがサポートしてくれていて、土台になってくれているから。これらのことは本当に大事だと思う。

 

そんなこんなで、プログラミング頑張ります。

それでは、また。