viva Cocoa Objective-C 入門 第1章 学習をはじめるにあたって
ホーム メール
 
目次 < 前ページ 次ページ >

型とポインタのおさらい

型とポインタ

 スポーツの世界でも、あるいは他の世界でも、何かを習得しようとする場合に必ず「壁」と呼ばれる部分があります。「乗り越えなければならない壁」という意味になりますが、C言語では「ポインタ」が壁であると言われています。そしてこれはC言語だけに言える事ではありませんが、「型が出てくると理解できない」という言葉もよく聞きます。実際に私の回りでは「ポインタが難しい」という言葉はあまり聞きませんが「型が出てくるともうダメだ」という言葉は何度か聞いた事があります。

 現在、RubyやPythonなどのライトウェイト・ランゲージ(Light Weight Language)もしくはスクリプティング言語と呼ばれている言語は、「型」や「ポインタ」が表面上は存在しないことになっています。しかしそれはあくまでも表面上のことだけでプログラマが意識しないところで型とポインタはしっかりと管理されています。言い方を換えれば、現在使われている主な開発言語で、型とポインタを持っていない言語は存在しないことになります。

■ Rubyや Python に型とポインタがないのは

 RubyやPythonではスカラー値も含めてすべての値がオブジェクトになっています。そしてその値を格納する変数の型として自動的にオブジェクト型の汎用のポインタが割り当てられます。これで表面的には型とポインタをプログラマが意識する必要がなくなります。スカラー値とは整数や実数などの単純な数値などのことです。
 しかしここで「すべての値がオブジェクトです」と言ってもそのオブジェクトについての説明は第3章からはじまることになっています。したがってこのことを今の段階で理解できなくても当然です。しかし本書を読み終えて、あらためてこのパラグラフに目を通されたときにはきっと理解できることだろうと思います。

変数

■ 型

 型やポインタを説明するにはまず変数を説明しなければなりません。昔のプログラミング言語の解説書には「変数とはデータを出し入れできる入れ物のようなもの」と説明されていました。これは少し曖昧な説明ですが、「プログラマがハードウェアに興味を持ち始めると肝心のプログラミングの勉強がおろそかになる」という配慮から、できるだけハードウェアを意識させない説明をするような風潮が昔はあったからです。
 しかし近年では「値を変更できるデータを格納するためにメモリに確保された場所を識別するために付けられた名前のこと」と明確に説明されるようになりました。少し長くて難しい説明ですが言葉としてできるだけ正確に表現しようとすればこのような説明になります。しかし簡単に言うと「変数とはデータを出し入れするためにメモリに確保された場所」ということになります。そしてそれぞれの場所を識別するために名前を付けることになっています。ここで重要なことはこの変数には必ず型(type)を指定しなければならないということです。なぜならメモリに格納されるデータは必ずバイナリデータになります。バイナリとは2進数のことです。例の 010101 というオン・オフのみで表現されるデータのことです。そしてこのバイナリデータの場合、それが整数を表すデータなのか実数(小数点数)を表すデータなのか文字を表すデータなのか、つまり何の型(データタイプ)なのかを指定しておかなければデータとしての値が変わってしまいます。

 ここで簡単な例を出してみます。C言語にcharという文字を格納するための型があります。この型は実際には整数値を保持する型になっています。そしてこのchar型はさらにsignedとunsignedという2つのタイプにわかれます。signedは「符号あり」という意味で + と - の値を持つことができます。それに対してunsignedは「符号なし」という意味で0を含めた正の整数しか保持できません。このchar型のサイズは1バイトつまり8ビットです。この場合にすべてのビットがオンつまり1であった場合。signedかunsignedなのかで値が変わってしまいます。

図 char型変数

 上記のchar型が符号なしの場合には255という数値を表します。しかし符号つきの場合には先頭のビット(図では1番左)が + の数値であるか - の数値であるかの符号を表します。そしてこの先頭のビットがオンつまり1であった場合にはマイナスの数値を表すことになっています。つまり上記のchar型は-128を表していることになります。

 なおsignedとunsignedは正確には型ではなく符号修飾子と呼びます。しかしこの符号修飾子も含めて型の性質は決まります。

■ ポインタ

 さてこの変数の名前とメモリ上の場所はプログラマが意識することなく処理系によって自動的に管理されることが約束されています。ようするにどの変数名がどのメモリ箇所を指しているかはプログラマが意識することなく自動的に管理されることになっているわけです。この「どの変数名がどのメモリ箇所を指しているか」ということはC言語まではプログラマが知る必要のないことだと考えられていました。ところがC言語では変数と結びつけられたメモリの場所をプログラマにも分かるようにしました。そしてこのメモリの箇所(メモリ上の住所番地)を格納するための新たな型として誕生したのがポインタです。ポインタも変数としてメモリに確保することができます。つまり“123”という整数を格納したaVariableという名前の変数がある場合aVariableのメモリ上の位置(住所番地)が0000351番地だとするとその番地を格納したaVariableのポインタ aVariablePointerという変数もメモリ上に作ることができるわけです。

図 ポインタ

 そろそろ話が難しくなってきました。この説明は一旦これで終わりにしたいと思います。今の段階ではご理解いただけたかどうかは分かりません。しかし大事なことが1点だけあります。それは実際のデータが入っている変数と、その変数の場所を格納しているポインタという変数は別個のものであり。メモリ上でも個別の変数として確保されているということです。

 なおポインタの有利性としては以下のような点があげられます。

 引数には値渡しと参照渡しがあることを思い出してください。この値渡しと参照渡しはともにそのデータのコピーが渡されます。つまり新たにメモリを消費することになります。値渡しはそのデータがそのままコピーされて渡されます。もしそのデータが音楽データや画像データであった場合は相当な量のメモリが消費されることになります。しかし参照渡しではポインタのコピーが渡されます。これはいつの場合でも4バイトになります。かなりの省エネになることをご理解いただけるのではないかと思います。そしてまた戻り値を返す場合は、その戻り値も新たな値としてメモリを消費することになります。戻り値を返さなくても良ければここでもまたメモリの節約になります。



目次 < 前ページ 次ページ >


Copyright 2006 - 2010 viva Cocoa. All Rights Reserved.