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とか足されるわけじゃなくて、ポインタの型のサイズに合わせて飛び飛びで足されるので注意