C言語なら俺に聞け(入門編)Part 131 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0755デフォルトの名無しさん
2016/02/11(木) 06:50:31.44ID:L8ovqpUs関数の引数として渡された配列名は、自動的に配列の先頭要素へのポインタに変換される。
配列とポインタに関してよく見かける説明文だと思うが、これに引っかかってる。
int Count(int arr[]);
int Count2(int *arr);
2つの関数は仮引数の表現(arr[], *arr)は違うが、まったく同じということ。
どちらの arr も int *arr (int型変数へのポインタ)として扱われる。
これにより、関数の返り値 sizeof(arr) / sizeof(int) の意味は、
どちらの関数でも sizeof(int*) / sizeof(int) である。
「int型ポインタを格納するのに要するメモリサイズと、intの値を格納するのに要する
メモリサイズの比」という、あまり意味のない値を計算しているのだ。
で、呼び出された関数の側で、引数の配列に含まれる要素数を知る方法。
配列の要素数は、自動的には関数に渡されないので、
「関数の引数として配列の要素数も与える」のが一般的。
extern int func(int arr[], int elems); /* 外部関数の場合 */
int main() {
int array[10];
int result;
result = func(array, sizeof(array)/sizeof(array[0]));
}
(注意) sizeof() は関数でなく演算子。
sizeof(array) のarrayはポインタには変換されないので
期待通り array[10] のバイト数が得られる。
■ このスレッドは過去ログ倉庫に格納されています