记得以前学C的时候总是会把这个知识点搞混,形参不知道怎么写,今天做个小结。
1.关于int a[]
这不是一个数组的声明,因为没有指定数组的大小,但是有两种情况会出现这种写法。
(1)int a[]={1, 2};
这个写法等价于 int a[2]={1,2}; 系统会自动计算大小。
(2)在形参时,如void func(int a[]);
这个写法等价于void func(int *a); 系统默认把数组转换为指针。
2.数组形参的3种写法(不包括引用)
void func(int *a);
void func(int a[]);
void func(int a[2]);//这个2可以替换为其他任意数字,会自动被系统忽略,但是必须为正
3.数组的引用
int a[4];
int (&b)[4]=a;
这样就定义了一个数组的引用b,注意是int (&b)[4] 而不是int &b[4], 一开始我不理解为什么要加括号,后来自己想了一种帮助理解的方法,引用符号&其实就是给变量取别名,所以&一定是跟这个变量名放在一起,所以无论什么情况下都要优先与别名结合。这也方便理解了为什么指针的引用写的是int * &p;
而int &b[4]是定义了一个存放4个引用的数组,而C++中是不存在引用数组的,因为引用本身并不占用内存,所以不能存在数组中。
有了数组的引用之后就可以用在函数形参上了,所以数组形参的第4种写法就是:
void func(int (&a)[2]);//注意这个2必须与实参的数组大小一致,否则编译不通过。
使用引用作为形参的好处就是不会出现像指针一样的越界情况,而缺点就是不够灵活,因为实参只能传长度一样的数组。