数组作为函数参数传递

数组有两个特殊的性质。一是不能复制数组;二是使用数组名字时,数组会自动转化为指向其第一个元素的指针。由于数组不能复制,所以无法编写使用数组类型形参的函数,因为数组会被自动转化为指针。

一、一维数组

1.三种定义形式:

 

  1. void printvalues(int *);  
  2. void printvalues(int []);  
  3. void printvalues(int [10]);  
void printvalues(int *);
void printvalues(int []);
void printvalues(int [10]);
  1. void printvalues(int a[],int size);//由于编译器会忽略第一维数组的长度,所以将其长度作为第二个形参  
void printvalues(int a[],int size);//由于编译器会忽略第一维数组的长度,所以将其长度作为第二个形参

①编译器不会为任何数组形参指定指定长度。因此下面调用都是合法的:

  1. int main()  
  2. {  
  3.  int i=0,j[2]={0,1};  
  4.  printvalues(&i); //ok  
  5.   printvalues(j);  //ok  
  6. }  
int main()
{
 int i=0,j[2]={0,1};
 printvalues(&i); //ok
  printvalues(j);  //ok
}

编译没问题,运行时会出错;

②数组形参定义为引用类型。非引用类型传递时,数组会悄悄的转为指针,即初始化为相应实参的副本,形参复制的是这个指针的值,而非数组元素本身。然而,通过形参指针做的任何改变都在修改数组元素本身。

定义为数组的引用时,将不会转换为指针,而是传递数组的引用本身,数组大小成为形参和实参类型的一部分,编译器会检查数组实参的大小和形参是否匹配。

  1. void printvalues(int (&arr)[10])  
  2. int main()  
  3. {  
  4.   int i=0,j[2]={0,1},k[10]={0};  
  5.  printvalues(&i); //error  
  6. printvalues(j);  //error  
  7. printvalues(k);//ok  
  8.   
  9. }  
void printvalues(int (&arr)[10])
int main()
{
  int i=0,j[2]={0,1},k[10]={0};
 printvalues(&i); //error
printvalues(j);  //error
printvalues(k);//ok

}

二、二维数组


两种定义

  1. void printvalues(int (*matrix)[10],int rowsize);  
  2. void printvalues(int matrix[][10],int rowsize);//因为和一维数组一样编译器会忽略第一维的长度,因此最好把第一维的长度作为第二个形参  
void printvalues(int (*matrix)[10],int rowsize);
void printvalues(int matrix[][10],int rowsize);//因为和一维数组一样编译器会忽略第一维的长度,因此最好把第一维的长度作为第二个形参


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值