算機実習 I

第九回 (2005年 6月 16日)

ポインタの応用

http://www.sw.it.aoyama.ac.jp/2005/Computer%20Practice%20I/lecture9.html

AGU

© 2005 Martin J. Dürst 青山学院大学

プログラミングへの心構え

ポインタの用途

メモリの使い方

メモリは変数などの種類によってに分けられ、使用領域が違う。典型例:

FFFFFFFF
スタック: ローカル変数、引数、関数呼び出しに必要なもの
↓↓↓↓↓↓↓↓ 下方向に伸び、使用後縮む ↑↑↑↑↑↑↑↑
 
空き領域
 
↑ ↑ ↑ ↑ ↑ ↑ およそ上方向に伸びる ↑ ↑ ↑ ↑ ↑ ↑
ヒープ: プログラム中任意に必要なメモリ
初期値を持たないグローバル変数
初期値を持つグローバル変数
関数などプログラムそのもの
00000000

ヒープの使い方

動的メモリの定石

定石の説明

if (!(           /* メモリが足りるかのテスト */
     pX =        /* * 新しいメモリへのポインタの代入 */
     (struct x*) /* 適切なポインタ型への変換 */
     malloc(sizeof(struct x))) /* メモリの大きさの計算と関数の呼び出し */
{
    printf("Not enough memory!\n"); /* エラー処理 */
    exit(1);
}

動的メモリの関数

動的メモリの注意

void *NULL

ポインタで配列処理の効率化

ポインタと配列の組み合わせ

ポインタと配列の違い

(int a[20], *p; を想定する)

ポインタと構造体

構造体をポインタでつなぐ

構造体をポインタでつなぐことがよくある (リスト、ツリー等)

構造体のメンバの一つを構造体へのポインタにする

その場合には無名の構造体が使えない。

例:

typedef struct line {
    char *s;
    struct line *next;
} line;

ポインタと関数

演習について

課題について

次回の準備