IkumaTadokoro / diary

MIT License
0 stars 0 forks source link

2022-08-22 #70

Open IkumaTadokoro opened 2 years ago

IkumaTadokoro commented 2 years ago

kaiyuさんにおすすめしてもらったので読む。

https://www.amazon.co.jp/E6-96-B0-E3-83-BB-E6-A8-99-E6-BA-96-E3-83-97-E3-83-AD-E3-82-B0-E3-83-A9-E3-83-9E-E3-83-BC-E3-82-BA/dp/477419381X/ref=dp_ob_title_bk

IkumaTadokoro commented 2 years ago
image

Cはなんでこんな言語ん「なっちゃった」のか。

image

Cのポインタがわからないのは、あなたが悪いわけじゃなく、単に、Cの文法がクソなだけだよ!! 前橋 和弥. 新・標準プログラマーズライブラリ C言語 ポインタ完全制覇 (Japanese Edition) (p.3). Kindle 版.

のっけからめっちゃおもしろいな笑

IkumaTadokoro commented 2 years ago

「なぜポインタというものが必要なんだろう?」と思うかもしれません

まさに知りたいことだ。今日軽く説明してもらった感じでは「ミニ四駆に穴を開けたくなる感覚かな?」とかいってたけどどうなんでしょう。

0章

本書のガイドライン。Cの解説書ではないので、基本的なところは他でやってという感じみたい。

とりあえず動かせる方がよさそうなので、Playgroundを探してみたらあった。

https://cplayground.com/

どうも5章では汎用的なデータ構造としてのポインタについて解説してくれるらしい。LeetCodeも捗りそう。

プログラミング言語なんてのは、しょせん人間が考えた文法で構成されていて、コンパイラというプログラムで完全に解釈しうる程 度のものです。 「なんかみんなこう書いてるから、 同じように書きゃ動くだろ」 では、やっぱりちょっと悲しいですよね。

じーん。

http://kmaebashi.com/seiha2/index.html

サポートページ

IkumaTadokoro commented 2 years ago

1章

Cはもともとアセンブラの代替品だったそうな。ここら辺の経緯って全然知らんからこれだけでためになるな。

C99が1999年に定められたCの規格で、C11が2011年に定められたCの規格。

Keep the spirit of C

・プログラマーを信じなさい (Trust the programmer.) ・プログラマーが、 理由があって何かをしようとしているとき、それを妨げてはいけない (Don't prevent the programmer from doing what needs to be done.) ・言語を小さく、シンプルに保とう (Keep the language small and simple.) ・ある1つの操作のためには、たった1つの方法だけを提供しよう (Provide only one way to do an operation.) ・たとえ移植性が保証されなくても、高速にしよう(Make it fast, even if it is not guaranteed to be portable.)

Cは、プログラマーは全知全能であるという理念のもとに設計されています。

なるほど、もともとアセンブラの代用としてUNIXのツヨツヨエンジニアが自分達のために作ったから、安全性とかはどうでもよくて、コンパイラを簡単に実装できるかと高速なコードを書けるかが売りなんだな。


アドレスはメモリの番地。変数を格納しているメモリ上の領域がオブジェクト、オブジェクトとして格納されるデータ型をオブジェクト型。

ポインタ型は他の型から派生することで存在する。これはGoのところの説明で読んだのと同じだと思う。


hoge_p」と書くとなんだか 「hoge_p」 という変数を宣言しているように見えてしまうかもしれません。 しかしここで宣言している変数はあくまで、 hoge_pであり、その型が「intへのポインタ」型なのです。

そう、これがよくわかんないからこの本読んでいる感もある。

// &はアドレス演算子
// %pでポインタの値を表示する
// %pに対してはvoidへのポインタを指定することになってる
printf("&hoge..%p\n", (void*)&hoge);

アドレスがポインタ型の値そのもの。

は間接演算子。ポインタにをつけることで、その指している先のものを表す。

あ〜、ポインタがアドレスを指すという感覚を頭の中でスッとイメージできると読みやすい。

とりあえずここまでは大丈夫そうだ!


int *hoge_p;

これは演算子ではない!!!えええ...。これは区切り子の一つなんだと。


コラムを読んでいる。

int hoge // 型 変数名
int *hoge_p // ポインタ型の宣言。
int* hoge_p // ポインタ型の宣言を型 変数名になるようにしてみる形
int* hoge_p, fuga_p 複数の型宣言で破綻する

なぜなら、Cの宣言の構文は、もうどうしようもないほど不自然で、 奇ッ怪で、変態的な構文なのですから。

随所に出てくる筆者の主張が面白い笑

ここら辺の話、GoのブログのSyntaxについての記事にも同じような話があったような。

https://go.dev/blog/declaration-syntax


ポインタ演算すると、そのアドレスはそのポインタが指す型のサイズだけ増加する。


Cのポインタについて説明すると、「なぜポインタなどというものを使わなければいけないのかがわからない」 と言う人がいます。

速度やハードウェア密着のプログラムを書かなくても、ポインタは必須。例として、関数から複数の値を返す、配列アクセス、LinkedListのようなデータ構造を表現するといったことが挙げられている。

C言語では複数の値を返す場合、そのポインタを渡して、それを経由して値を書き込んでもらう(え?え?)

Cでは、こういうことはポインタを使わない限り実現できません。

Cにおける関数呼び出しでは引数を値渡ししている。だから関数側に実引数として渡したものは「値」だけが渡されて、その変数自体(つまりはアドレス値)は渡されない。

C++とかC#には参照渡しがあるけど、Cにはないので「ポインタを値渡し」する。

https://magazine.rubyist.net/articles/0032/0032-CallByValueAndCallByReference.html

これはRubyの解説記事。


ちょっと集中が切れたので、配列は今日の夜にしよう