教科書のList 3-2(p.72)では,C言語のプログラムでよく使われるメモリーの確保と配列
に関するテクニックが書かれている.また,List 3-4(p.75-77)では型定義という方法が
使われている.これらは重要なので,よく理解すること.
- array=(int *)malloc(sizeof(int)*count);
少々複雑に見えるが,処理される順に見ていけば簡単である.
- 最初にsizeof(int)が評価される.関数sizeof()は,型のバイト数を
返す.ここでは,整数型intのバイト数である4が返される.
- 次に,この4とデータ数であるcountの乗算が行われる.この結果は,デー
タを格納するために必要なバイト数の計算になっている.
- malloc()関数は,Memory ALLOCate(記憶割付)の略で,引数で渡
されたバイト数のメモリーを確保して,その先頭のポインター(アドレス)を返す.
- (int *)はキャストと呼ばれる強制型変換である.mallocで返される
ポインターは強制的に整数型としている.従って,ポインターを+1加算すると,
アドレスは4つ進むことになる.
- 整数型のポインター(アドレス)を整数型のポインターarrayに代入してい
る.
- free(array);
関数free()は,そのプログラムで使用しているメモリー領域を開放するた
めにある.ここでは,mallocで確保された領域を開放している.
- int *arrayとarray[n]
ポインターで宣言しているものを配列として使っている.これは,配列がどのように処
理されているか,考えればよく分かる.配列array[n]は,*(array+n)と評価
される.すなわち,配列array[n]は,ポインターarrayにn加算したポ
インター(アドレス)が示す値と言うことである.このようなことから,配列で宣言して
いなくても,配列のように使うことができるのである.
- typedef struct tagListNode{
struct tagListNode *prev;
struct tagListNode *next;
int data;
} ListNode;
これは,TYPE DEFine(型定義)と呼ばれるもので,型に別名をつける役割があ
る.ここでは,struct tagListNodeと言う型を,ListNodeという別名
で使える.このことにより,宣言が簡単になる.
- lastnode=NULL
これは,ヌルポインター,あるいは空ポインターと呼ばれるものである.これは,
lastnodeが何も指し示していないことを保証するために,使っている.
- newnode->data=buf;
newnodeはポインターである.ポインターが指し示す構造体のメンバーにアクセス
する場合,アロー演算子(->)を使う.ここでは,ポインターnewnodeが示す
構造体のメンバーdataにbufの値を代入している.ポインターではなく,普
通の変数となっている構造体の場合,そのメンバーにアクセスするにはドット演算子
(.)を使う.
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
2005-11-28