計算機実習 I
第九回 (2014 年 6 月 5 日)
ポインタの基礎
http://www.sw.it.aoyama.ac.jp/2014/CP1/lecture9.html
Martin J. Dürst
© 2005-14 Martin
J. Dürst 青山学院大学
今日の予定
- ミニテスト
- 前回の演習問題について
- ポインタの用途
- メモリの仕組み
- ポインタの型・宣言・定義
- ポインタの演算
- 配列とポインタ
ミニテスト
- 授業開始までにログイン済み
- 授業開始まで教科書、資料、筆箱、財布などを鞄に入れ、鞄を椅子の下に
- テスト終了後その場で待つ
前回の演習問題について
未提出 (またはエラー): 08A1: 2人、A2: 2人、08B1: 3人、08C1:
9人、08C2: 31人 (完成: 59)
08C2 (温度のクラス) のメンバ変数の選択
- 数値と単位
- 単位ごとに三つ
- kelvin だけ
- celsius だけ
ポインタの用途
- 低レベルのアドレス操作 (デバイス割り当てなど)
- 配列の処理とその効率化
- 動的メモリの管理
- 参照 (関数への参照渡しなど)
- 間接 (indirection)
メモリの仕組み
- コンピュータでの (メイン) メモリは (膨大な)
バイトの列
- メモリの番地は「アドレス」(address)
- 番地・アドレスは通常、十六進数で表現
- 人間は名前が使いやすいので、プログラムで変数名など使用
- プログラム内部ではアドレスで操作
- 二バイト以上の長さのデータの番地には最初のバイトのアドレスを使用
- アドレスが入った変数はポインタ (pointer)
メモリの仕組みを調べる
ポインタの演算 (&
/*
)
- アドレス演算子
&
(単項、address operator):
ある変数のアドレスを取得、例えばポインタに代入
int count, *pi;
pi = &count;
- 間接演算子
*
(単項、indirection operator,
dereference operator):
ポインタからそのポインタが指す値を発見
printf("Count is %d.\n", *pi);
ポインタの型
- ポインタは他の型 (整数、関数、構造体など) と別
- ポインタ型には指す型が含まれている
- 例:
int
のポインタ、double
のポインタ、
char
のポインタ、構造体 Person
のポインタ
*
演算子の結果の型が決定
例: : int
のポインタ pi
→
*pi
の型が int
- 指し違いが (ある程度) 防止可能
ポインタの宣言・定義
- 変数名に
*
を付け、指された型を明記
- 宣言・定義内の演算子の優先度は式と同様 (p. 388
参照)
int *pi;
は「pi
は整数へのポインタ」のではなく、
「*pi
は整数」と宣言
例:
int *pi; // int へのポインタ
char *pc; // 文字へのポインタ
// 文字列 (の先頭) を指すこともある
int **ppi; // int へのポインタへのポインタ
char *pa[5]; // char *(pa[5])
// 長さ 5 の (文字へのポインタの) 配列
char (*pb)[5]; // 5 文字の配列へのポインタ
char c, *pc, *pa[5], (*pb)[5]; // char だけ共通
ポインタの演算 (+
/-
)
- ポインタに整数が足し引き可能
- 足し算、引き算 (
p+5
, p-3
,...)
- 代入足し算、代入引き算 (
p += 7
,...)
- インクリメント、デクリメント (
p++
,
p--
)
- 整数 1
でポインタはポインタが指す型のサイズ一個分移動
(ポインタが指す型のサイズが寸法の単位)
- (同型の)
二つのポインタの引き算が可能で、結果は整数
*p++
と (*p)++
の違いに注意 (教科書
p. 388)
配列とポインタ
- 配列には同じ型のデータが順番に並んでいる
- C の場合、配列の最初の位置しか記憶されない
- 配列とポインタは非常に似ている
実際、C の場合には配列とポインタは殆ど同じ
(例外:
配列が定義された関数内の配列そのものへの代入が禁止、sizeof
の結果)
配列とポインタのメモリ配置の実例
演習問題について
- 09A1: 各データ型のポインタ・アドレス
(型の順番、変数名の変更に注意)
- 09A2: ポインタの動きの予想・観察
(
++
/--
)
- 09A3: ポインタと配列の関係
- 09B1: 大文字を数える関数
- 09C1: 月の番号を英語名に変更 (英語以外も可能; 09C2
も同様)
- 09C2: メモリ配置表の記入
注: 締め切りは全部日曜日
09A2, 09A3, 09C2:
プログラムをシステムに提出、かつ用紙を先生に提出
(09C2 の用紙の最後の締め切りは次回の演習開始)
次回の準備
- 宿題として残った問題を完成し、提出
- 今日の復習
- 「ポインタが理解できない理由」の第六章 「malloc
とポインタ」(浅井 淳、技術評論社、2002)
をよく読む。
- 参考書の第 11 章 (ポインタ、pp. 282-311)
をもう一回よく読む。分かるところをリストアップする。