第30回
データ構造(9)~構造体の基本

構造体のメンバ参照

1つの型の中に複数の異なる型の変数(メンバ)が包括されている構造体では、個々のメンバを個別に参照できなければなりません。そのためには、メンバ参照演算子を用います。

直接メンバ参照演算子「.」

構造体の各メンバの値を参照するには、直接メンバ参照演算子「.」を使って以下のように記述します。
<構造体型変数名>.<メンバ名>

先に紹介した構造体型“s_staff”で
s_staff stf;
として変数“stf”を宣言した場合、例えばint型のメンバ“id”の値は
stf.id
として参照できます。この値を別のint型変数staff_idに代入するなら、以下のようになります。
int staff_id;
      :
staff_id = stf.id;
※ もちろん、代入の前に構造体のメンバ“id”に
  何らかの値が保持されていることが前提です。

char型配列の扱い

char型配列は文字列として扱うため、文字列を扱う関数の引数にできます。その際には、メンバ名は当然char型のポインタとして扱えます。例えば、メンバ“name”に“TANAKA Tsutomu”という文字列をコピーするなら、以下のように記述します。
strcpy(stf.name, "TANAKA Tsutomu");
また、char型配列のメンバを以下のようにしてポインタで扱うこともできます。
char strbuf[256 + 1];
char *p;
p = stf.name;
strcpy(strbuf, stf.name);

この場合は、char型配列“strbuf”に構造体stfのメンバ“name”の中身がコピーされます。

あとがき

hiropの『ちょっと気になる専門用語』~識別子

今回は「識別子」という言葉自体を問題にしたいのではありません。識別子~symbolとはデータや命令などを区別するために設けられた、あるいはプログラマ ーが設ける唯一の名前のことです。

処理系にあらかじめ備わっている命令などは「予約語」あるいは「キーワード」であり、変数名や関数名はプログラマーが予約語と重複しない範囲で自由に付けられます。

Cでは、識別子は小文字で記述するのが慣例となっています。forやstructなど数々の命令語、型名はもちろん、標準ライブラリ関数もすべて小文字です。但し、#defineプリプロセッサ指令による記号定数には
#define 1024 _BUFMAX
のように大文字を使うことがよくあります。これは、変数や関数と記号定数とを見分けやすくするためです。


Cでは、このように識別子を小文字で、しかも省略し 、切り詰めて少ない文字数とするのが慣例となっていました。例えば、文字列をコピーする関数“strcpy”はstring→str、copy→cpyと6文字に縮められています。

昔のコンピュータは記憶領域(メモリとディスク)の容量が少なく、またCPUの速度も遅かったため、識別子をできるだけ短くすることでリソースを節約し、かつソースの読み書きやコンパイルの速度を速めようとしたのです。

しかし、関数名ならともかく変数名があまりに短いと読み取るのに苦心します。例えば、「商品の最大在庫数」を示す変数なら“Maximum number of stock”のような名前を付けるのが最善ですが、Cの場合これを“maxstock”あるいは単語の区切りに“_”を挿入して“max_stock”、stockを短縮して“maxstk”のような名前とすることが一般的です。

演算子など非常に記号的な記述が特徴のCでは、識別子も記号的にした方がソースの見た目も「かっこいい」といったことも理由の1つでしょう。


Cを拡張したオブジェクト指向言語のC++では、識別子に大文字と小文字の混在が当たり前となりました。そのため、先の「最大在庫数」なら“MaximumNumber_of_Stock”のような記述が一般的です。

記憶領域の増大やCPUの能力向上も理由の1つでしょう。処理能力に余裕があれば、識別子はできるだけ冗長な方がソースは分かりやすくなります。

もちろん、あまり長すぎると綴りミスの原因になるため、適度な長さであることが重要です。また、キーワードが英単語を基本としているため、変数名も英単語を基本とすることが慣例となっています。“ZaikoNoSaidaiSuu”などとローマ字で記述すると、ソースを読む人は一瞬戸惑ってしまうでしょう。


さて、「冗長な識別子」で思い出すのはCOBOLという言語です。FORTRANと並んで老舗とも言える歴史的な言語で、今も汎用機の事務処理プログラムなどで使われています。

僕の知っている範囲のことなので、全般にそうだったかどうかは分かりませんが、昔のCOBOLのソースでは識別子に「日本語のローマ字表記」がよく用いられていました。
単価→TANKA
在庫→ZAIKO
など、そのままローマ字にしたものもありましたが、リソースを節約する目的でローマ字表記をさらに切り詰めた記述もよく見かけました。
氏名→SMEI
税額→ZGAKU
また、これも文字数の節約からだと思うのですが、ローマ字は一般になじみのあるヘボン式ではなく、小学校で教わる文部省式 が使われていました。
利率→RIRITU
支払→SIHARAI


COBOLで日本語のローマ字表記が使われた理由は、おそらくそれまでのプログラミングが数学・科学分野のものだったのに対し、事務系の分野で使われたことが理由ではないかと思います。

かっこよく英単語を並べるより、英語の分からない人にでも処理の意味が分かるように――という配慮だったのでしょう。実際、それまでまったくプログラミングの経験がない事務担当者が研修を受け、COBOLのプログラミングを担当させられたりした時代でした。

似たようなことが、Webの世界でも起こっています。JavaScriptのソースにローマ字表記が使われているのを見かけることがあります。また、ネットワーク上のコンピュータ名に“KEIRI”(経理)などと命名する例は多数あります。

2008年10月~12月に放送されたTVドラマ「ブラッディ・マンデイ」(TBS系)で、三浦春馬扮する主人公・高木藤丸がビルのシステムをハッキングして監視カメラの映像を探るシーンがありました。その映像の中で、監視カメラのサーバー名が“KANSI1”(監視1)などと表示されていたのに気付いた人もいると思います。なんとなく「ダサい」と感じますが、実際、日本人が操作するならローマ字表記の方が分かりやすいでしょう。

ちなみに、「ブラッディ・マンデイ」のDVD-BOXⅡは2009年3月27日に発売されるそうです。