c++は関数の中で配列とsizeofの用法の注意事項を伝達します

1132 ワード

通常、配列の最初の要素を指すポインタは関数に渡され、配列のサイズも入力されます(後述します).
void by_pointer(int *p, int size); void by_pointer(int p[], int size); void by_pointer(int p[7], int size);//the 7 is ignored in this context!
注意配列を次のように印刷すると
void printArray(int data[]) {
for(int i = 0, length = sizeof(data); i < length; ++i)
{
    std::cout << data[i] << ' ';
}
std::cout << std::endl;

}
配列には、sizeof(data)が実際にポインタのサイズを返すため、前の4つの要素だけが印刷されていることがわかります.なぜなら、このプロセスでは、配列はコピーされず、配列の最初の要素を指すポインタがコピーされるからです.
式num_がありますElements=sizeof(array)/sizeof(array[0])は配列中の要素の個数を算出できますが、使用する場合もトラップがあります
include
using std::cout;
int a[] = { 1, 2, 3, 4, 5 };
int counta() { return sizeof( a )/sizeof( a[ 0 ] );//works, since a[] is an array }
int countb( int b[] ) { return sizeof( b )/sizeof( b[ 0 ] );//fails, since b[] is a pointer }
int main() { cout « “The size of a is "« counta() « endl; cout « “The size of b is "« countb( a ) « endl; }
counta()では、コンパイラはグローバル変数aのタイプを知っています.そのサイズも含まれています.
In countb()は、コンパイラがパラメータb[]をポインタ*bと見なし、ポインタbが指す配列の大きさを知らない