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
、挑戦は必須、完成は発展問題、月曜日締切)