atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
オチャメモ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
オチャメモ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
オチャメモ
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • オチャメモ
  • C言語-まとめ

オチャメモ

C言語-まとめ

最終更新:2008年09月04日 08:17

ochamemo

- view
だれでも歓迎! 編集
  • はじめに
  • メイン関数について
  • 配列について
    • 添え字演算子は配列とは無関係
    • 関数の仮引数の宣言
    • 多次元配列
  • メモリ確保
  • アライメント
  • 宣言の解読
    • 基本
      • 手順
      • 宣言解読の例
    • const
    • 型のサイズ計算

はじめに

「C言語ポインタ完全制覇」の内容をもとにC言語の復習。 この本は2000年ぐらいに買ったもの。当時十分C言語の開発経験はあったつもりだったけど、はっきり言って、この本の内容を当時の自分は理解してなかった。 この本は、初心者の2冊目の本として、もしくは中級者の知識の総点検として非常にお勧めだと思う。

メイン関数について

int main(void)
int main(int argc, char*argv[])

これ以外は間違い。

配列について

添え字演算子は配列とは無関係

  • 式の中では、配列は「その先頭要素へのポインタ」に読み替えられる。
  • p[i]は、*(p + i)の読み替え

関数の仮引数の宣言

  • 関数の仮引数の宣言の場合に限り、配列の宣言はポインタに読み替えられる。
  • ほかの普通の宣言のときは配列として宣言されることに注意。

多次元配列

int hoge[3][5];へアクセスするとき、何が起きてるかの解説。

引用 p175

1 hogeの型は「int配列(要素数5)の配列(要素数3)」である。
2 だが、式の中なので、配列はポインタに読み替えられる。よってhogeの型は「intの配列(要素数5)へのポインタ」となる。
3 hoge[i]は、*(hoge + i)のシンタックスシュガーである。
  1 ポインタにi加算することは、そのポインタが指す型のサイズiだけ進む。
  2 *(hoge + i)の*により、ポインタがひとつはがされる。*(hoge + i)の型は「intへの配列(要素数5)」となる。
  3 が、式の中なので、配列がポインタに読みかえれらる。*(hoge + i)の最終的な型は「intへのポインタ」となる。
4 (*(hoge + i))[j]は、*((*(hoge + i)) + j)に等しい。したがって、(*(hoge + i))[j]は「intへのポインタにjだけ加算した
  アドレスの内容であり、型はintである。

メモリ確保

  • mallocの戻り値の型はvoid*だ。
    • したがって戻り値をキャストする必要はない。
  • cmalloc/cfree
    • callocを使ってメモリ領域をゼロクリアするよりも、自前で0xccなどで埋めたほうがバグを発見しやすい。
  • reallc
    • 引数で指定したポインタのメモリ領域を広げる。その領域の後ろが開いてれば単に広げるだけだが、開いてなければ別の領域に新たにコピーするため重い。
    • javaのコレクションもこれを使ってると思われ。javaの場合は最初にある程度ガバッと領域確保し、それが足りなくなったらまたガバッという感じで確保するのだろう。Javaがメモリ食いまくりの理由の一員はこれもあると思う。

アライメント

コンピュータのワード境界に合わせて以下のような詰め物をよくすると思う。

typedef struct {
  int int1;
  char pad1[4];
  double double1;
  char char1
  char pad2[7]
  double double2;
} Hoge;

こんなことをしなくてもコンパイラは勝手にアライメントをあわせてくれるという。 しかしこれはターゲットによると思う。昔、組み込み系の開発やったけど、パディングしないと アドレスエラーが出てしまいバグの原因となった。まぁコンパイラがしょぼかったのかもしれないが。

宣言の解読

基本

手順

引用 p144

--ここから--

  1. まず識別子(変数名または関数名)に着目する。
  2. 識別しに近いほうから、優先順位に従って派生型(ポインタ、配列、関数)を解釈する。優先順位は以下のようになっている。
    1. 宣言をまとめるための括弧
    2. 配列を意味する[]、関数を意味する()、
    3. ポインタを意味する*
  3. 派生型を解釈したら、それを「of」または「to」または「returning]で連結する。
  4. 最後に、型指定子(左端にある、intとかdoubleとか)を追加する。
  5. 英語が苦手な人は、順序を逆にし、日本語で解釈する。 --ここまで--

宣言解読の例

引用(一部要約) p145

--ここから--

C言語 英語的表現
int hoge; hogeis int
int hoge[10]; hoge is array(size 10) of int
int hoge[10][3] hoge is array(size 10) of array(size3) of int
int *hoge[10]; hoge is array(size 10) fo pointer to int
double (*hoge)[3]; hoge is pointer to array(size 3) of double
int func(int a); func is function(arg int) returning int
int (*func_p)(int a); func_p is pointer to function (arg int a) returning int

--ここまで--

宣言に関しては以下が読めれば卒業だな。慣れてないと難しいよ(p199)。

void (* signal(int sig, void (*func)(int)) ) (int);

答え

signal is function(sig is int, func is pointer to function(int) returning void) returning pointer to function(int) returning void
singnalは「voidを返し引数がintの関数へのポインタ」を返す関数で、その引数は2つあり、1つは、int, もう1つは、「voidを返し引数がintの関数へのポインタ」である。

ポイントは、戻り値が関数へのポインタであること。これが異常に複雑になる原因。 以下のようにtypedefすればかなりわかりやすくなる。

typedef void(*sig_t)(int);
sig_t signal(int sig, sig_t func);

const

引用 p180

--ここから--

  1. 「Cの宣言を解読する」で述べた規則に従い、識別子から初めて、順に外側に英語で宣言を解読していく。
  2. 解読した部分の左側にconstが出現したら、そこで「reado-only」を追加する。
  3. 解読した部分の左側に型指定子が出現し、さらにその左側にconstがある場合、型指定子をとりあえず飛ばしてread-onlyを追加する。
  4. 英語が苦手な人は、constがその直後の単語を修飾していることに注意しながら、日本語に訳す。 --ここまで--

例

宣言 英語
char * const src src is read-only pointer to char
char const *src src is pointer to read-only char
const char *src 同上

型のサイズ計算

定期的に読めるかチェック。

引用(一部要約) p159

--ここから--

宣言 サイズ
int hoge; 4byte
int hoge[10]; 4 x 10 = 40byte
int *hoge[10]; 4 x 10= 40byte
double *hoge[10] 4 x 10 = 40byte
int hoge[2][3]; 4 x 3 x 2 = 24byte

--ここまで--

「C言語-まとめ」をウィキ内検索
LINE
シェア
Tweet
オチャメモ
記事メニュー

メニュー

  • Tips
  • まとめ
  • ハマリ
  • 本
  • その他
  • このwikiのページ一覧

リンク

  • ブログ
  • OCHAGL
  • Wiki文法

アクセス数

  • 本日: -
  • 昨日: -
  • 全体: -


ここを編集
記事メニュー2

更新履歴

取得中です。


ここを編集
最近更新されたページ
  • 6157日前

    C言語-まとめ
  • 6160日前

    Emacs-Tips
  • 6162日前

    Python-まとめ
  • 6164日前

    Python-Tips
  • 6165日前

    GoogleAppEngine-Tips
  • 6165日前

    VMWare-Tips
  • 6165日前

    Windows-Tips
  • 6165日前

    Linux-Tips
  • 6166日前

    Screen-Tips
  • 6168日前

    トップページ
もっと見る
「まとめ」関連ページ
  • No Image JavaScript-勉強会
  • No Image ActionScript-まとめ
  • No Image PHP-まとめ
  • No Image JavaScript-まとめ
最近更新されたページ
  • 6157日前

    C言語-まとめ
  • 6160日前

    Emacs-Tips
  • 6162日前

    Python-まとめ
  • 6164日前

    Python-Tips
  • 6165日前

    GoogleAppEngine-Tips
  • 6165日前

    VMWare-Tips
  • 6165日前

    Windows-Tips
  • 6165日前

    Linux-Tips
  • 6166日前

    Screen-Tips
  • 6168日前

    トップページ
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. MadTown GTA (Beta) まとめウィキ
  2. AviUtl2のWiki
  3. R.E.P.O. 日本語解説Wiki
  4. シュガードール情報まとめウィキ
  5. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  6. ソードランページ @ 非公式wiki
  7. SYNDUALITY Echo of Ada 攻略 ウィキ
  8. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  9. ドラゴンボール Sparking! ZERO 攻略Wiki
  10. 星飼いの詩@ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 検索してはいけない言葉 @ ウィキ
  6. 発車メロディーwiki
  7. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  8. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  9. オレカバトル アプリ版 @ ウィキ
  10. モンスター烈伝オレカバトル2@wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. 千鳥の鬼レンチャン 挑戦者一覧 - 千鳥の鬼レンチャン サビだけカラオケデータベース
  3. 召喚 - PATAPON(パタポン) wiki
  4. ロスサントス警察 - ストグラ まとめ @ウィキ
  5. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  6. ステージ - PATAPON(パタポン) wiki
  7. 犬 ルリ - ストグラ まとめ @ウィキ
  8. ステージ攻略 - パタポン2 ドンチャカ♪@うぃき
  9. 鬼太郎誕生 ゲゲゲの謎 - アニヲタWiki(仮)
  10. 鬼レンチャン(レベル順) - 鬼レンチャンWiki
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.