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 フォーラム: 中央の画面の自動更新