数组形参:
void printValues(int*);
void printValues(int[]);
void printValues(int[10]);//以上三种是等价的。
通常,将数组形参直接定义为指针要比使用语法定义更好。
第三种方式,形参的长度容易引起误解。
当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组的类型是否匹配,而不会检查数组的长度。
数组实参:
和其他类型一样,数组形参可定义为引用或非引用类型。大部分情况下,数组以普通的非引用类型传递,此时数组会悄悄地转换为指针。一般来说,非引用类型的形参会初始化为其相应实参的副本。而在传递数组时,实参是指向数组第一个元素的指针,形参复制的是这个指针的值,而不是数组元素本身。函数操纵的是指针的副本,因此不会修改实参指针的值。然而,函数可通过该指针改变它所指向的数组元素的值。通过指针形参做的任何改变都在修改数组元素本身
通过引用传递数组:
在《C++ Primer 第四版》的第七章208页,讲到了通过引用传递数组,和其他类型一样,数组形参可声明为数组的引用。如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组大小成为形参与实参类型的一部分,编译器检查数组实参的大小与形参的大小是否匹配。
int (&a)[13],两边的圆括号是必须的,因为[]的优先级大于&
int &a[13]表示一个指向13个整形引用的数组,而(int &)a[13]表示含有13个整形元素数组的引用
#include<iostream>
using namespace std;
void output(int (&a)[13])
{
for (int i = 0; i < 13; i++)
cout << a[i] << " ";
cout << endl;
}
void modify(int(&a)[13])
{
for (int i = 0; i < 13; i++)
a[i] += 1;
}
int main()
{
int a[13] = {1,2,};
output(a);
modify(a);
output(a);
return 0;
}