水流さんへC言語講座 ー HelloWorld編

@kaorin_linux さんによるC言語講座。
4
かおりん@ @kaorin_linux

というのがポインタの概念ですが、問題は、それを何に使うんか、ってことなんだと思うんですが。(笑) まあ、何にでも使えます、というか、ポインタがそういうものだと解ってないと、非常に困ります。ポインタとは、「メモリアドレス」なのです。♡

2010-12-25 04:53:23
かおりん@ @kaorin_linux

なので、ポインタを関数の引数として渡して、その受け取った関数内で「ポインタの指し示すアドレス」の「中身」を変更すると、メモリの中身そのものが変わってしまうことになります。♡

2010-12-25 04:54:23
かおりん@ @kaorin_linux

まあ、さきほどの例だと無意味ですが、**argv=0とかやってしまうと、コマンドライン引数そのものが、全て無かったことになります。(笑) まあ、無意味ですが。♡

2010-12-25 04:55:35
かおりん@ @kaorin_linux

とまあ、ちとポインタの話が長くなりましたが、次に進みましょうか。♡

2010-12-25 04:55:55
かおりん@ @kaorin_linux

()のあとに{が来ています。これはC言語では、構文ブロックを表しています。つまり、main関数の本体は{から始まり}で終わるということですね。これは各種構文の複文(ブロック)を表現するのにも使われます。♡

2010-12-25 04:57:26
かおりん@ @kaorin_linux

3行目のprintf("Hello world\n");で、ようやく、画面に出力することになります。これは、stdio.h内で定義されている関数、printfを使って"Hello World\n"という「文字列」を標準出力に出力する関数を呼び出していることになります。♡

2010-12-25 05:00:22
かおりん@ @kaorin_linux

関数がprintf、引数が"Hello World\n"ということですね。printfは文字型のポインタを引数として受け取り、標準出力に出力する関数ということになります。♡

2010-12-25 05:01:31
かおりん@ @kaorin_linux

なので、別にprintf(argv[0])でも、関数の呼び出し的には正しいですし、自分自身のコマンド名が表示されるだけで、プログラム的にも、全く問題ありません。♡

2010-12-25 05:01:47
かおりん@ @kaorin_linux

4行目にreturn 0;となっています。あ、ちなみにC言語では、行の終端は;で表されます。引数とかたくさんあって、一行が長くなる場合などに、ソースコード上では改行を入れてもいいので、本来の行の終わりの印として;を使っています。♡

2010-12-25 05:02:59
かおりん@ @kaorin_linux

元に戻しますが、returnそのものは、C言語の値を返す構文です。main関数定義のところで、この関数はint型を返す、と決めてしまっているので、0を返している、だけです。処理結果によっては、違う値を返すことになります。♡

2010-12-25 05:04:04
かおりん@ @kaorin_linux

そして、最後に}で、main関数のブロックを終了して、このプログラムの実行そのものも終了します。♡

2010-12-25 05:04:42
かおりん@ @kaorin_linux

以上、勝手に「水流さんにC言語講座」でした。w♡

2010-12-25 05:05:03
かおりん@ @kaorin_linux

ちなみに、C言語プログラムは、ほぼ、ポインタとメモリとの格闘になります。正しい領域確保と開放、ポインタによるアドレッシングなど、それらの概念が理解できていても、ミスを起こしやすい言語であるのは間違いありません。言語仕様的にライブラリを基本使う、というのもそれを助長しています。♡

2010-12-25 05:07:06
かおりん@ @kaorin_linux

コンパイル時にチェックの方法が提供されてないからです。実行時にエラーになるかどうかの判断をしないとならない。なので、モダンな言語で、これらのポインタとメモリ管理を忘れて、「プログラムの書き方」というか「やりたいことのプログラムへの起こし方」を先に覚えてしまってからC言語でもOK♡

2010-12-25 05:08:44
かおりん@ @kaorin_linux

とワタクシなぞは考えます。原始的な言語なので、覚えることが少ないので、案外学習時間も短く、お手軽に使える印象がありますが、実際のアプリケーション開発では、メモリリークや、メモリ破壊などの、「謎の現象」に悩まされることが多く、実際の開発には時間がかかる言語のひとつではあります。♡

2010-12-25 05:10:10
かおりん@ @kaorin_linux

まずはLLで「アプリの書き方、考え方を学ぶ」その後、C言語で、高速なアプリケーション開発やメモリ管理の方法を学ぶ、でも遠回りにはならないと思います。♡

2010-12-25 05:11:35
かおりん@ @kaorin_linux

なお、オブジェクト指向的なプログラミングは、C言語でも、ある程度可能です。クラスという形で隠蔽は出来ませんが、ソースコードそのものをひとつのクラスと捉え、モジュールの外に見えない変数として定義することで、クラスメンバ的に使うことも出来ますし。♡

2010-12-25 05:14:32
かおりん@ @kaorin_linux

クラスがないとOOP出来ないわけではないので、念の為。OOPってのはプログラム設計技法に過ぎないというワタクシの主張の根本がこの辺にあります。単にプログラム設計のひとつの考え方です。♡

2010-12-25 05:16:03
かおりん@ @kaorin_linux

クラスやインターフェースの機能があると、「ラクにOOPできる」だけです。考え方そのものが、他の言語で実践できないわけではないので、別にLLでOOPまで勉強してからC言語でも、なんの問題もありません。♡

2010-12-25 05:17:08
かおりん@ @kaorin_linux

ただまあ、実際に一番重要なのは「アプリケーションの機能をプログラムに起こす」には「どう考えていけばいいのか」という考え方であり、言語仕様や構文を覚えることなど、ぶっちゃけどうでもいいんです。♡

2010-12-25 05:20:09
かおりん@ @kaorin_linux

やりたいことを、その言語で、どうやれば実現できるのか、を考え、学ぶことが一番で、単なる文字列をコンソールに表示出来たから、アプリケーション開発が出来るか、というとそんなこともなく。♡

2010-12-25 05:21:05
かおりん@ @kaorin_linux

「やりたいこと」を「機能」に分解し、「機能」を「個々の関数」に分解していく、文字通りブレイクダウンしていく設計がきちんと行えれば、言語なんて、最低限の構文とライブラリ知識さえ学んでしまえば何でも同じ、というのがワタクシの持論です。♡

2010-12-25 05:22:23
かおりん@ @kaorin_linux

これは、関数型言語を知った今でも変わってません。アプリケーション開発考え方そのものには違いはないと思っています。♡

2010-12-25 05:22:56
かおりん@ @kaorin_linux

ぼうげん以外でも、意外に暇つぶしになったな。今後は、これで行くか。勝手に「水流さんに〜言語講座」♡

2010-12-25 05:24:39
かおりん@ @kaorin_linux

@付きでやってるわけじゃないから、誰の迷惑にもならん、これだっ!♡

2010-12-25 05:25:59