C言語メモ
sizeofで取得できる配列のサイズ
よくある配列の要素数lengthを求めるコード
#include <stdio.h> int main() { /* 要素数10の配列をゼロ初期化 */ int array[10] = {0}; /* 要素数を求める */ int length = sizeof array / sizeof array[0]; /* 要素数出力 */ printf("%d\n",length); /* 10 と出力 */ }
次のコードはうまく動かない
#include <stdio.h> int len(int*); int main() { /* 要素数10の配列をゼロ初期化 */ int array[10] = {0}; /* 要素数出力 */ printf("%d\n", len(array) ); /* 2 と出力(処理系によって違う) */ } /* 配列の要素数を求める?? */ int len(int *array) { /* 要素数を求めてるつもり */ int length = sizeof array / sizeof array[0]; return length; }
配列に対するsizeofはメモリ上に占めている領域の大きさを返す
同じ関数内で定義した配列に対するsizeofはうまく動作するけど、
関数に配列を渡してしまうと、ポインタの指す配列(array)はメモリ上から見えず、ポインタ型(int*)のサイズになってしまう
ポインタのインクリメント
*pt++はポインタのアドレスがインクリメントされる
つい直感的に考えてしまってはまること多し
きちんと(*ptr)++とすると要素の値がインクリメントされる
あと、ポインタと数字の足し算はただ単に1とか足されるわけじゃなくて、ポインタの型のサイズに合わせて飛び飛びで足されるので注意