第6章. 相棒のポインター
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
彼がそうだ。
私たちのかわいい歌を好きなのは誰だろう
彼は一緒に歌うのが好きなんだ
彼は銃を撃つのが好きだ。
しかし、彼はその意味を知らない。
ニルヴァーナ、"イン・ブルーム"
音楽についての歌やハリウッドについての映画のように、ポインターは他のデータを説明するデータである。確かに圧倒されるのは簡単だ:一度に、参照への参照、エイリアス化、メモリ管理、malloc に迷い込むことに対処しなければならない。しかし、私たちのとんでもない幸運は、別々のコンポーネントに分解される。例えば、malloc を気にすることなく、エイリアス化としてポインタを使うことができる。 は、90年代の教科書で言われていたほど頻繁に登場する必要はない。一方では、Cの構文はスターを使うので混乱しがちだが、他方では、Cの構文は関数へのポインターのような特に複雑な設定を扱うためのツールを提供してくれる。
この章では、よくあるエラーやよくある混乱点を取り上げる。長い間Cで書いてきた人なら、これらの点は当たり前のことのように思えるだろう。この章は、ポインタを扱うときに少し不安を感じるすべての人(その数は膨大である)を対象としている。
自動メモリー、静的メモリー、手動メモリー
C言語には3つの基本的なメモリー管理モデルがある。さらに読者へのボーナスとして、あと2つのメモリ・モデル(「スレッド・ローカル」でスレッド・ローカル、「巨大なデータセットにmmapを使う」でmmaped)を紹介する。
- 自動
-
変数は最初に使うときに宣言し、スコープ外に出ると削除される。
staticキーワードがなければ、関数内の変数はすべて自動型である。一般的なプログラミング言語には自動型のデータしかない。 - 静的
-
静的変数は、プログラミングの全期間を通じて同じ場所に存在する。配列のサイズは起動時に固定されるが、値は変更される可能性がある(つまり、完全に静的というわけではない)。データは
mainが起動する前に初期化されるため、初期化は計算を必要としない定数で行わなければならない。関数の外側(ファイル・スコープ内)で宣言された変数や、staticキーワードを使った関数の内部で宣言された変数は静的である。静的変数の初期化を忘れると、すべてゼロ(またはNULL)に初期化される。 - マニュアル
-
手動型には
mallocとfreeが含まれ、セグメンテーションフォールトのほとんどがここで起こる。1また、宣言後に配列のサイズを変更できる唯一のメモリタイプでもある。
表6-1は、データを置くことができる3つの場所の違いを示している。これらの点については、次の数章で詳しく説明する。
| 静的 | オート | マニュアル | |
|---|---|---|---|
|
起動時にゼロにセットされる |
◊ |
|
|
|
スコープ限定 |
◊ |
◊ |
|
|
開始時に値をセットできる |
◊ |
◊ |
|
|
開始時に定数でない値をセットできる |
|
◊ |
|
|
|
◊ |
◊ |
|
|
関数呼び出しにまたがって持続する。 |
◊ |
|
◊ |
|
グローバルに対応できる |
◊ |
|
◊ |
|
配列のサイズは実行時にセットできる。 |
|
◊ |
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access