[閒聊] passing array to function

看板C_and_CPP (C/C++)作者 (小乖)時間16年前 (2009/04/22 17:08), 編輯推噓2(203)
留言5則, 4人參與, 最新討論串1/1
考慮利用一 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)

04/22 17:43, , 1F
感謝分享
04/22 17:43, 1F

04/22 18:08, , 2F
為什麼不用 vector...
04/22 18:08, 2F

04/22 21:53, , 3F
Z的部分,大概因為要轉型的是指向的內容,而不是指標
04/22 21:53, 3F

04/22 22:02, , 4F
,嗯,我上面的想法應該有錯,不要看
04/22 22:02, 4F

04/23 00:13, , 5F
其實後來發現 reinterpret_cast<int(&)[3]>(a[8]) 也可
04/23 00:13, 5F
文章代碼(AID): #19xjwVii (C_and_CPP)
文章代碼(AID): #19xjwVii (C_and_CPP)