C++配列は関数パラメータとしていくつかの問題があります。

2502 ワード

回転:http://blog.csdn.net/tanghw/article/details/6554538
この論文では、C++の配列に関する2つの問題を解決する必要があります。1.行列は関数パラメータとして、伝値ですか?それとも伝点ですか?2.関数パラメータの配列要素の個数は確定できますか?
まず下のコードを見てください。
#include <iostream>



using namespace std;



void testArrayArg(int a[])

{

	cout << endl;



	cout << "in func..." << endl;

	cout << "array address: " << a << endl;

	cout << "array size: " << sizeof(a) << endl;

	cout << "array element count: " << sizeof(a) / sizeof(a[0]) << endl;



	cout << "changing the 4th element's value to 10." << endl;

	a[3] = 10;

}



int main()

{

	int a[] = {1, 2, 3, 4, 5};



	cout << "in main..." << endl;

	cout << "array address: " << a << endl;

	cout << "array size: " << sizeof(a) << endl;

	cout << "array element count: " << sizeof(a) / sizeof(a[0]) << endl;



	testArrayArg(a);



	cout << endl << "the 4th element's value: " << a[3] << endl;



	return 0;

}

 
運転結果は以下の通りです。
 
in main...array address:0012 FF 4 Caray size:20 array element count:5
 
in func...array address:0012 FF 4 Caray size:4 array element count:1 change the 4 th element's value to 10.
 
the 4 th element's value:10
 
配列aを直接パラメータとしてtestArayArg()を呼び出すと,実参とモダリティの両方のアドレスは0012 FF 4 Cである。また、testArayArg()でa[3]の値を10に修正した後、main()関数に戻り、a[3]の値も変更されました。これらはC+++の配列が関数パラメータとしてアドレス指定されていることを示している。
 
特に注意したいのは、main()では配列の大きさが決定されます。
 
array size:20 array element count:5
 
しかし、関数パラメータとして渡された後、そのサイズ情報は失われ、配列の最初の要素の情報のみが残ります。
 
array size:4 array element count:1
 
これは、C+++は実際には配列をポインタとして伝達し、ポインタは配列の最初の要素を指すからである。後ろの配列はどこで終わりますか?C++の関数伝達機構は責任を負いません。
 
上記の特性は、配列が定義されたドメイン範囲だけでサイズを決定することができるとまとめられてもよい。
 
void testArrayArg2(int a[], int arrayLength)

{

  cout << endl << "the last element in array is: " << a[arrayLength - 1] << endl;

}

 
このようにメールで呼び出すことができます。
testArayArg 2(a,sizeof(a)/sizeof(a[0])
このようにtestArayArg 2()では配列要素に安全にアクセスできます。
したがって、配列パラメータを受け入れる関数で配列の各要素にアクセスする場合、配列を定義するドメイン範囲で配列サイズを別の補助パラメータとして伝える必要があります。次のような別の関数の定義があります。