作者spider391 (小乖)
看板C_and_CPP
標題[閒聊] passing array to function
時間Wed Apr 22 17:08:46 2009
考慮利用一 function 列印 array 內的元素
通常會用以下的方法 ( passing array as pointer )
=================================================
void fun(int* a,int size)
{
for(int i=0;i<size;i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
fun( a, 10 );
return 0;
}
=================================================
此方法呼叫的時候,需給 array pointer 以及 array size
有個神奇的用法,利用 reference to array 的方式 (passing array as array)
=================================================
void fun( int (&a)[10] ) // a reference to an array of 10 ints
{
for(int i=0;i<10;i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
fun( a );
return 0;
}
=================================================
此方法只需要傳入一個變數。但是這樣的話 void fun( int (&a)[10] ) 只能對 array
大小等於 10 的陣列處理。
若是結合 template,則對任意 size 都有個對應之 fun 來處理
=================================================
template<int size>
void fun( int (&a)[size] ) // a reference to an array of "size" ints
{
for(int i=0;i<size;i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
fun( a );
return 0;
}
=================================================
有個有趣的問題是,若是我想傳 a[8]~a[10] 當作 array 傳給 fun 該如何處理?
法一: passing array as pointer
利用 pointer 的方法很簡單,只要傳入 fun( a+8 , 3 ) 即可。
法二: passing array as array
=================================================
template<int size>
void fun( int (&a)[size] ) // a reference to an array of "size" ints
{
for(int i=0;i<size;i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int* z = static_cast<int*>(a); //轉成 pointer
z+=8; //指到a[8]
fun ( reinterpret_cast<int(&)[3]>(*z));//轉成reference to an array of 3 ints
fun( a );
return 0;
}
=================================================
此方法不是很容易了解,我是試了蠻多次才試出來的,像是
reinterpret_cast<int(&)[3]>(*z) 中
為何要用 *z 而不是 z ,就不是很了解。
以前傳陣列都是用 pointer 的方法在傳,提供另外種方法給大家參考。
請指教
Have FUN!!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.97.179
※ 編輯: spider391 來自: 220.132.97.179 (04/22 17:10)
1F:推 cravingtrue:感謝分享 04/22 17:43
2F:推 littleshan:為什麼不用 vector... 04/22 18:08
3F:→ tsaiminghan:Z的部分,大概因為要轉型的是指向的內容,而不是指標 04/22 21:53
4F:→ tsaiminghan:,嗯,我上面的想法應該有錯,不要看 04/22 22:02
5F:→ spider391:其實後來發現 reinterpret_cast<int(&)[3]>(a[8]) 也可 04/23 00:13