数组与指针看起来很像
int a[] = {1, 2 ,3};
int *p = a;
如此,我们可以p[0], p[1], p[2]
看起来,与直接使用数组名没什么两样,但是看这段代码
sizeof(a)
sizeof(p)
你就会知道,原来数组里还隐含了大小信息,这是指针所不能做到的
严格的说,数组是一种内置的数据类型,C++标准对这种数据类型限定的某些行为使他看起来像
指针
1array are passed by reference by default
这句话是说,我们可以将数组名赋给指针,将数组名放进函数参数中,则数组会退化成指针,再用sizeof得不到尺寸信息
void func(int a[]);
很多人以为这个函数只接受数组为参数,结果在函数内部sizeof(a)发现,它就是一指针int*,坑人
2array are not assignable
这里最关键的是数组名不能作为左值,不管是用int a[3]声明的数组还是int a[] = new int[3];得到的数组
在基本数据类型里,引用也具有这种"从一而终"的特性
3如何真正的传递数组(避免它退化成指针)
看下面的函数原型
void func(int(&a)[100]);
这个函数只接受大小为100的整型数组,有没有发现,我们按引用类型来传参数,就能避免数组退化成指针
当然这么写没什么用,毕竟一个只能传递定长数组的函数也只能看看而已
利用c++模板编程的手法,可以这样子:
template<size_t N>
void func(int(&a)[N]);
这样就能接受任意大小的数组了,而且只接受数组