一.数组引用形参和多维数组形参
void print(int (&arr)[10])
{..............}
//如果形参里面是 (int &arr[10]) 这是引用的数组,相对于是包含10个引用的数组,这一般是非法的声明
这样的数组引用形参只能将函数作用于大小为10的数组
传递多维数组形参:
其实没有真正的多维数组,多维数组不过是数组的数组,
比如a[10][10],其实就10个数组元素, 每个元素是含有10个元素的数组!
操作数组其实就操作数组的首地址,也就是指向数组首地址的指针
那么:
void print(int (*max)[10])
{.......}
//声明成指向含有10个整数的数组的针织,同理如果这样声明 (int *max[10]) 指的是10个指针构成的数组
//等价定义:
void print(int max[][10])
{......}
//max的声明看起来像一个二维数组,实际上形参是指向含有10个整数的数组的指针,因为编译器会忽略掉第一个维度。
//int a[][]:第一个中括号表示有此二维数组有几行,第二个表示有几列。
二。可变形参
声明成initializer_list 和vector 一样 也是一种模板类型,但其对象中永远是常量值,无法改变其中的值。下列 中li.begein()返回的是首指针。
void sumnuber(initializer_list<int> li)
{
int sum = 0;
for (auto beg = li.begin(); beg != li.end(); ++beg)
sum += *beg;
cout << sum << endl;
}
sumnuber({ 1,2,3,4 });
sumnuber({ 1,2,3,4,5 });*/
三.指向数组的指针可以直接用下标访问
int a[] = { 2,4,6,8,0,1,3,5,7,9 };
int *p = a;
p[0]就相当于*(p+0)
p[2]就相当于*(p+2)
数组的两个特殊性质对我们定义和使用作用在数组上的函数有影响,这两个性质分别是:
数组作为形参
不允许拷贝数组;
使用数组时通常会将其转换成指针。
因为不能拷贝数组,所以我们无法以值传递的方式使用数组参数。
因为数组会被转换成指针,所以当我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针。
尽管不能以值传递的形式传递数组,但是我们可以把形参写成类似数组的形式:
//尽管形式不同,但这三个print函数是等价的
//每个函数都有一个const int*类型的形参
void print(const int*);
void print(const int[]);
void print(const int[10])//这里的维度表示我们期望数组含有多少元素,实际不一定