4

次の関数では、配列の長さをどのように見つけることができますか

int fnLenghthOfArray(int arry[]){
    return sizeof(arry)/sizeof(int); // This always returns 1
}

ここで、この関数は常に 1 を返します。一方、assizeof(arry)/sizeof(int)は、配列が宣言されている関数内の配列の実際の長さを示します。

ベクトルまたはテンプレートを使用する場合

template<typename T,int N> 

int fnLenghthOfArray(T (&arry)[N]){

}

サイズを取得できます。しかし、ここでは関数プロトタイプを変更することはできません。

これを見つけるのを手伝ってください。

4

8 に答える 8

3

関数宣言でarrayは、ポインターです。

int fnLenghthOfArray(int arry[])
                        ^
                          is same as int* array 

そしてあなたのシステムでsizeof(int*) == sizeof(int)

于 2013-07-29T09:53:31.047 に答える
1
int fnLenghthOfArray(int arry[]){
    return sizeof(arry)/sizeof(int); // This always returns 1
}

この関数は、ポインタのサイズと整数のサイズの間で除算を実行しているため、1 を返します。ほとんどのアーキテクチャでは、ポインタのサイズは整数のサイズと同じです。たとえば、x86アーキテクチャでは、両方のサイズが 4 バイトです。

一方、 sizeof(arry)/sizeof(int) は、配列が宣言されている関数で、配列の実際の長さを示します

この場合、コンパイラはそれarryが配列であり、そのサイズを認識しているためです。一方、前の関数では、コンパイラarryはポインタとしてしか認識していません。int arry[]実際、関数プロトタイプを指定すると、 と の間に違いはありませんint * arry

于 2013-07-29T09:54:36.880 に答える