c/c++配列長を求める
c++には配列の長さを求めるデフォルト関数がなく、自分で書くしかありません
配列の長さを求めます:は使いやすいため、c言語の中でマクロを定義して配列の長さを求めます: c++でテンプレート関数を定義することもできます:
使用時にテンプレート関数を呼び出します.
しかし
配列が関数に伝達されると、ポインタが伝達され、ポインタは配列ヘッダarr[0]のみを指し、長さ情報は一切ないので、配列に伝達されると、配列長を同時に関数に伝達します.
これは、配列をパラメータとして関数に渡すと、この配列はポインタ
配列の長さを求めます:
int ArrayLength = sizeof(array) / sizeof(array[0]);
#define ARR_LEN(array, length){length = sizeof(array) / sizeof(array[0];}
使用する時、直接関数を呼び出すことができます:int len, arr[] = {3, 1, 4};
ARR_LEN(are, len); // len 3
template<class T>
int GetArrLen(T &array) {
return sizeof(array) / sizeof(array[0]);
}
使用時にテンプレート関数を呼び出します.
int arr[] = {3, 1, 4};
int len = GetArrLen(arr); // len 3
しかし
配列が関数に伝達されると、ポインタが伝達され、ポインタは配列ヘッダarr[0]のみを指し、長さ情報は一切ないので、配列に伝達されると、配列長を同時に関数に伝達します.
void length_array(int arr[]){
int len = getArrayLen(arr);
cout << "len = " << len << ", sizeof(arr) = " << sizeof(arr) << endl;
}
len = 1, sizeof(arr) = 4
; これは、配列をパラメータとして関数に渡すと、この配列はポインタ
int *arr
に劣化するからである.