http://www.sw.it.aoyama.ac.jp/2015/CP1/lecture10.html
© 2005-15 Martin J. Dürst 青山学院大学
void * と NULL ポインタ| 09A1 | 09A2 | 09A3 | 09B1 | 09C1 | 09C2 | |
| 100点 | 75 | 77 | 79 | 43 | 40 | 43 |
| 60点 | 19 | 17 | 14 | 49 | 48 | 46 |
| エラー | - | - | 1 | 1 | 3 | 1 |
| 未提出 | - | - | 1 | 3 | 4 |
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;
}
int countUpper (char *string)
{
int count = 0;
while (*string)
if (isupper(*string++))
count++;
return count;
}
注意: 特別な指示がない限り、プログラムは配列方式でもポインタ方式でも提出可能 (読みやすさ重視)
メモリは変数などの種類によってに分けられ、使用領域が違う。典型例:
| FFFFFFFF | |
| スタック: ローカル変数、引数、関数呼び出しに必要なもの | |
| ↓↓↓↓↓↓↓↓ 下方向に伸び、使用後縮む ↑↑↑↑↑↑↑↑ | |
| 空き領域 |
|
| ↑ ↑ ↑ ↑ ↑ ↑ およそ上方向に伸びる ↑ ↑ ↑ ↑ ↑ ↑ | |
| ヒープ: プログラム中任意に必要なメモリ | |
| 初期値を持たないグローバル変数 | |
| 初期値を持つグローバル変数 | |
| 関数などプログラムそのもの | |
| 00000000 |
malloc
等)free)(pattern)
#include <stdlib.h>int masize = 10;
int *my_array;if (!(my_array = (int *) malloc(sizeof(int)*masize)))
printf("Not enough memory!\n"), exit(1);
my_array[5] = 500;free (my_array);if (!( // メモリが足りるかのテスト
my_array = // 新しいメモリ領域のアドレスをポインタへ代入
(int *) // my_array のポインタ型への変換
malloc( // 関数の呼び出し
sizeof(int) // my_array の一つの要素の大きさ
* asize) // メモリ領域の大きさの計算
))
printf("Not enough memory!\n") // エラーの通知
, // 順次演算子
exit(1); // プログラムの強制終了
malloc: メモリ領域の確保calloc: メモリ領域の確保、 0 で初期化realloc: メモリ領域の再確保新場所 =
realloc(旧場所、新サイズ);
pNew = realloc(pOld, 10); free: メモリ領域の解放realloc, free
にはブロックの先端のアドレスが必要void *malloc 等の戻り値の型が void *void * は特定の型を持たないポインタmalloc 等はメモリが足りないときに
(void*)0 を返すNULL ポインタNULL
を使用NULL のポインタを参照するとエラー
(segmentation fault 等)NULL と 0 と '\0'
と「偽」は概念的に別だが、C の場合は同一扱いmalloc、テストファイルあり)[]
は使用禁止)realloc、挑戦は必須、完成は発展問題、月曜日締切)