Head First C
――頭とからだで覚えるCの基本

[cover photo]
  • 2013年04月 発行
  • 604ページ
  • ISBN978-4-87311-609-9
  • フォーマット Print PDF
  • 原書: Head First C

オライリー・ジャパンで書籍を購入:
定価3,888円

Ebook Storeで電子版を購入:
価格3,110円

認知科学、教育心理学に基づき、効率よく学習でき、知識が確実に身に付くように工夫されたHead FirstシリーズのC言語バージョン。前半では文法、メモリとポインタ、make、データ型などC言語の基本をていねいに解説。後半では、プロセス間通信、ソケットとネットワーキング、スレッドといった高度な話題についても詳しく述べています。また、ArduinoのコードをCで書いて観葉植物をしゃべらせてみる、OpenCVを利用して自宅の防犯システムを作ってみる、アーケードゲームを作ってみる、という実用と趣味を兼ねた楽しい読みものも掲載。初心者からさらにCの知識を深めたい中上級者、日曜プログラマまで楽しめる一冊です。

関連書籍

C実践プログラミング 第3版
Cクイックリファレンス 第2版
GNU Make 第3版
Head First Java 第2版

序章
    この本を読むのにふさわしい人は?
    あなたがどう思っているかわかっています
    メタ認知
    脳を思い通りにさせるためにできること
    初めに読んでね
    テクニカルレビューチーム
    謝辞

1章 Cを始める
    Cは小規模で高速なプログラムのための言語
    でも、完全な Cプログラムはどんなの?
    でも、どうやってプログラムを実行するの?
    2種類のコマンド
    ここまでのコード
    カードカウント? Cで?
    ブール値は等価条件以外にもある……
    現時点でコードはどうなっている?
    スイッチに切り換える
    一度だけでは不十分なこともある……
    ループは同じ構造になることが多い……
    中断するためには breakを使う……
    Cツールボックス

2章 メモリとポインタ
    Cコードにはポインタがある
    メモリに踏み込む
    ポインタを携えて出航する
    変数へのポインタを渡すようにする
    メモリポインタの利用
    どのようにして関数に文字列を渡すの?
    配列変数はポインタに似ている……
    コードの実行時にコンピュータが考えること
    しかし、配列変数は完全なポインタではない
    なぜ配列は0から始まるの?
    ポインタはなぜ型を持つの?
    データ入力でのポインタの利用
    scanf()には注意
    fgets()がscanf()の代わりになる
    文字列リテラルは決して書き換えられない
    文字列を変更する場合はコピーする
    メモリの暗記
    Cツールボックス

2.5章文字列
    フランクを探して
    配列の配列を作成する
    検索テキストを含む文字列を見つける
    strstr()関数の使用
    おさらいの時間
    配列の配列とポインタの配列の比較
    Cツールボックス

3章 小さなツールの作成 
    小さなツールは大きな問題を解決できる
    プログラムが行うべき動作
    でも、ファイルを使っていない……
    リダイレクトを利用しよう
    標準エラーとは
    デフォルトでは、標準エラーは画面に送られる
    fprintf()はデータストリームへ出力する
    fprintf()を使ってコードを書き換えよう
    小さなツールは柔軟性がある
    geo2jsonツールを変更しない
    異なるタスクには異なるツールが必要
    入力と出力をパイプでつなぐ
    bermudaツール
    でも、複数のファイルに出力したい場合はどうなるの?
    独自のデータストリームを使う
    main()には別の使い方がある
    ライブラリに仕事をしてもらう
    Cツールボックス

4章 複数のソースファイルの使用
    すぐわかるデータ型入門
    小さなものに大きなものを入れてはいけない
    整数をfloatに格納する
    弱ったな……失業中の俳優だ……
    コードがどうなったのか見てみよう
    コンパイラは驚きたくない
    定義から宣言を分離する
    最初のヘッダファイルの作成
    共通機能がある場合は……
    コードを別のファイルに分割できる
    コンパイルの舞台裏
    共有コードには独自のヘッダファイルが必要
    そんなに難しいことなの?
    すべてのファイルを再コンパイルしない
    まず、ソースをオブジェクトファイルにコンパイルする
    ファイルの管理は難しい
    makeツールでビルドを自動化する
    makeの動作方法
    コードに関することはmakefileを使ってmakeに知らせる
    発射!
    Cツールボックス

Cラボ1 Arduino

5章 構造体、共用体、ビットフィールド
    多くのデータを扱わなければいけないこともある
    オフィスでの会話
    構造体を使って独自の構造化データ型を作成する
    魚(fish)を渡す
    「.」演算子を使って構造体のフィールドを読み取る
    構造体を別の構造体に含められる?
    構造体はどのように書き換えるの?
    このコードは亀のクローンを作っている
    構造体へのポインタが必要
    (*t).ageと*t.age
    同じ種類のものに異なる型のデータが必要な場合もある
    共用体はメモリ空間を再利用できる
    共用体はどのように使うの?
    enum変数はシンボルを格納する
    ビットレベルで制御したい場合もある
    ビットフィールドは任意のビット数を格納する
    Cツールボックス

6章 データ構造と動的メモリ
    柔軟な記憶領域が必要か?
    連結リストはデータの連鎖のようなもの
    連結リストは挿入が可能
    再帰構造体を作成する
    Cで島を作成する……
    リストへの値の挿入
    動的記憶領域にはヒープを使う
    使い終わったらメモリを返す
    malloc()でメモリを要求する……
    strdup()関数を使ってコードを修正しよう
    使い終わったらメモリを解放する
    SPIESシステムの概要
    ソフトウェア科学捜査:valgrindの利用
    valgrindを繰り返し使ってさらに証拠を集める
    証拠を調べる
    修正の確認
    Cツールボックス

7章 高度な関数
    理想的な相手を探す……
    関数にコードを渡す
    find()に関数の名前を伝える必要がある
    関数名はすべて関数へのポインタである……
    でも、functionデータ型はない
    関数ポインタの作成方法
    C標準ライブラリでソートする
    関数ポインタを使って順序を設定する
    返信の自動化
    関数ポインタの配列を作成する
    関数に伸縮性を持たせる
    Cツールボックス

8章 スタティックライブラリと
    ダイナミックライブラリ
    銀行に持っていけるコード
    山かっこは標準ヘッダに使う
    でも、コードを共有したい場合はどうなるの?
    .hヘッダファイルの共有
    フルパス名を使って.oファイルを共有する
    アーカイブには.oファイルがある
    arコマンドでアーカイブを作成する……
    最後に、他のプログラムをコンパイルする
    ヘッドファーストジムがグローバルに展開中
    カロリーの計算
    でも、状況はもう少し複雑……
    プログラムは多くの部品から作られる……
    ダイナミックリンクは実行時に起こる
    .aを実行時にリンクできる?
    まず、オブジェクトファイルを作成する
    ダイナミックライブラリの呼び名はプラットフォームによって
    異なる
    Cツールボックス

Cラボ2 OpenCV

9章 プロセスとシステムサービス
    システムコールはOSへのホットライン
    誰かがシステムに侵入した……
    問題はセキュリティだけではない
    exec() 関数を使えば、より詳細に制御できる
    exec() 関数がたくさん
    配列関数:execv()、execvp()、execve()
    環境変数を渡す
    ほとんどのシステムサービスは失敗したときに同じように
    動作する
    RSSでニュースを読む
    exec()はプログラムの終点
    fork()とexec()で子プロセスを起動する
    Cツールボックス

10章 プロセス間通信
    入力と出力のリダイレクト
    典型的なプロセスの中を調べる
    リダイレクションはデータストリームを置き換えるだけ
    fileno()はディスクリプタを教えてくれる
    待たなければいけないこともある……
    子プロセスとの連絡を保つ
    パイプでプロセスをつなげる
    事例研究:ブラウザで記事を開く
    子プロセスでは
    親プロセスでは
    ブラウザでWebページを開く
    プロセスの死
    シグナルを捕捉して独自のコードを実行する
    sigactionはsigaction()で登録する
    シグナルハンドラを使うようにコードを書き換える
    killを使ってシグナルを送る
    コードにモーニングコールを送る
    Cツールボックス

11章 ソケットとネットワーキング
    インターネットノックノックサーバ
    ノックノックサーバの概要
    BLAB:サーバがインターネットとやり取りする方法
    ソケットは標準的なデータストリームではない
    サーバが適切に開始しないことがある
    なぜ常にエラーを調べるように言われるの?
    クライアントからの読み込み
    サーバは同時に1人しかやり取りできない
    クライアントごとにプロセスをfork()できる
    Webクライアントの記述
    クライアントの担当
    IPアドレスのソケットを作成する
    getaddrinfo()はホストのアドレスを取得する
    Cツールボックス

12章 スレッド
    タスクは逐次的?
    ……プロセスでは必ずしも解決にはならない
    単純なプロセスは一度に1つのことを行う
    追加スタッフを雇う:スレッドの使用
    どのようにスレッドを作成するの?
    pthread_createでスレッドを作成する
    このコードはスレッドセーフではない
    信号機を追加する
    ミューテックスを信号機として使う
    Cツールボックス

Cラボ3 Blasteroids ゲーム

付録i 未収録事項
    1.演算子
    2.プリプロセッサディレクティブ
    3.staticキーワード
    4.データの大きさ
    5.自動テスト
    6.gccの詳細
    7.makeの詳細
    8.開発ツール
    9.GUIの作成
    10.参考文献

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

1刷正誤表

Head First C

2013年4月25日更新

位置
p.474
4つめの
答え
(コード
下から
7行目)
int connect_d = send int connect_d = accept
p.474
5つめの
答え
(コード
下から
5行目)
accept (connect_d, msg, strlen(msg), 0); send (connect_d, msg, strlen(msg), 0);
p.488
2つめの
答え
(コード
6行目)
close( !fork() ); close( listener_d );

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]