关于数组

数组声明

数组声明时,我们可以指定其大小,也可以不指定,但后一种情况必须初始化,编译器通过初始化可以确认该数组大小;

1
2
3
4
int a[10] = {1,2,3,4,5};  //正确,数组大小是10
int a[] = {1,2,3,4,5}; //正确,数组大小是5
int a[10]; //正确,数组大小是10
int a[]; //错误,无法确定数组大小

数组大小

1
2
int a[] = { 0,1,2,3,4,5,6,7,8,9,2,3,4,5,6};
int x = sizeof(a) / sizeof(a[0]);

数组形参

  • 当数组作为形参时,有两个特殊的性质:不允许拷贝数组、数组将会转化为指针,这也就意味着:当数组已经作为形参传入函数后,已经不能再使用上述sizeof函数的方式来计算数组元素个数了;那么我们此时就必须考虑元素个数的传入问题;
1
2
3
4
5
void print(const int*);//正确,但无法获知当前数组的元素个数
void print(const int[]);//正确,但无法获知当前数组的元素个数
void print(const int[10]);//正确,同时我们知道了当前数组元素个数为10,但是针对元素个数不为10的数组无法适用
void print(const int*,int n);//这种似乎是最佳方式,适用于任何大小的数组
void print(const int[],int n);//同上
  • 数组作为形参时实际是一个指针,那么如果const修饰该指针那么也就是一个底层const,即无法修改数组中元素;

返回数组

返回指针并不困难,因为指针指向某个地址,地址中存储某个value,但是返回数组却略有不同,因为数组v有大小,那么返回时我们必须考虑同时返回数组的大小,此外,数组不允许拷贝,也就是说我们必须返回数组的指针,这两者导致了在实际操作上存在困难;但是C++还是提供了相应方案,主要分为以下三种:

  • 使用类型别名;
  • 声明一个返回数组指针的函数
  • 使用尾置返回类型
  • 使用decltype

参考代码

0%