作者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