int Sum( int array[10] )
{
int i, sum;
for( sum =0, i = 0;i<10; i++ )
sum += array;
return( sum );
}
main( )
{
int sum;
int score[10] = {75,80,81,76,75,86,90,77,80,81};
sum = Sum( score );
}
例中array是主调函数中的实参数组名,在被调函数中声明了形参数组,且大小为10,但实现上,在形参中指定数组大小不起任何作用,因为数组名作为实参传递时,仅是把实参数组的起始地址传递给形参数据,所以被调函数也可以声明成如下形式:Sum( int array[ ] )或Sum( int *array )。
在COM组件中,缺省情况下,指针参数总是被假设为指向单个实例的指针,而不是数组,在参数中传递一个数据最简单的方法是使用固定数组技术,也就是在参数中指名数组维数信息。假设Sum为一组件接口方法函数,则其接口就应该描述为:HRESULT Sum( [in] int array[10] )。然而,当你自己用C++写一个COM组件程序(dll形式),然后再用C++来本地调用(准确的说是套间内调用)这个组件是,也可以将接口方法描述为:HRESULT Sum( [in] int array[] )或HRESULT Sum( [in] int *array),并且程序也能得到正常的运行结果,但这样的接口方法描述存在两个问题:1、当用C#引用组件的DLL或TLB时,array会被认为是个指针,而在C#中声明的数组,数组名不能作为实参传递。2、当这个方法函数是跨套间调用时,接口代理仅会将array[0]的值解析出来,通过COM的RPC通信协议将数据发送到COM服务器存根,此时在接口方法内再操作其它array元素将出错。所以正确的接口描述应该是HRESULT Sum( [in] int array[10] ),接口代理总是在OPRC请求消息中分配10*sizeof(int)个字节空间,将后把10个元素一起拷贝到消息中,一旦服务器收到些ORPC请求消息,接口存根直接用接收到的缓冲区作为函数的参数。