http://www.sw.it.aoyama.ac.jp/2014/CP1/lecture10.html
© 2005-14 Martin J. Dürst 青山学院大学
void *
と NULL
ポインタ
char *month_names[] = { ...
char month_names[][10] = { ...
int
のポインタなど&
(アドレス演算子)
で取得*
(関節演算子)
ではアドレスが指しているものを取得+ 1
でポインタが指す型の大きさ一個分移動*&
v ≡ v&*
p ≡ p*(
p+
i)
≡
p[
i]
≡
i[
p]
[
p]
は完全に非推薦)(*
sp).
m ≡
sp->
m&array[i]
の単純化:
→ &(array[i])
→ &(*(array+i))
→ &*(array+i)
→ (array+i)
→ array+i
int countUpper (char string[]) { int i; int count = 0; int length = strlen(string); for (i=0; i<length; i++) if (isupper(string[i])) count++; return count; }
目的:
手順:
[
と ]
の除去->
の導入注意: 特別な指示がない限り、プログラムは []
でもポインタでも提出可能 (読みやすさ重視)
メモリは変数などの種類によってに分けられ、使用領域が違う。典型例:
FFFFFFFF | |
スタック: ローカル変数、引数、関数呼び出しに必要なもの | |
↓↓↓↓↓↓↓↓ 下方向に伸び、使用後縮む ↑↑↑↑↑↑↑↑ | |
空き領域 |
|
↑ ↑ ↑ ↑ ↑ ↑ およそ上方向に伸びる ↑ ↑ ↑ ↑ ↑ ↑ | |
ヒープ: プログラム中任意に必要なメモリ | |
初期値を持たないグローバル変数 | |
初期値を持つグローバル変数 | |
関数などプログラムそのもの | |
00000000 |
malloc
等)free
)#include <stdlib.h>
int asize = 10;
int *array;
if (!(array = (int *) malloc(sizeof(int)*asize))) printf("Not enough memory!\n"), exit(1);
array[i] = 500;
free (array);
if (!( // メモリが足りるかのテスト array = // 新しいメモリ領域のアドレスをポインタへ代入 (int *) // array のポインタ型への変換 malloc( // 関数の呼び出し sizeof(int) // array の一つの要素の大きさ * asize) // メモリ領域の大きさの計算 )) printf("Not enough memory!\n") // エラーの通知 , // 順次演算子 exit(1); // プログラムの強制終了
malloc
:
メモリ領域の確保、メモリが足りないときに
(void*)0
を返すcalloc
: メモリ領域の確保、 0 で初期化realloc
: メモリ領域の再確保新場所 = realloc(旧場所、新サイズ);
pNew = realloc(pOld, 10);
free
: メモリ領域の解放realloc
, free
にはブロックの先端のアドレスが必要void *
malloc
の戻り値の型が void *
void *
は特定の型を持たないポインタNULL
ポインタNULL
を使用NULL
のポインタを参照するとエラー
(segmentation fault 等)NULL
と 0
と '\0'
と偽は概念的に別だが、C の場合は同一扱いmalloc
、テストファイルあり)realloc
、テストファイルあり、発展問題)Q&A フォーラム: 中央の画面の自動更新