感觉这一小节有三点是我之前一直不太清楚的,或者是不曾注意的
1、不允许拷贝数组(之前没注意这个知识点),这个特性直接导致了第二点(数组传参会转换成指针)
2、为函数传递一个数组是,实际上传递的是指向数组的首元素的指针
3、数组引用参数 void print(int (&arr)[10]);
1、针对第一点比较简单,例如下面写法是不会被编译通过的
int a[] = { 0, 1, 2 };
int a2[] = a;
2、由于函数实参传递是通过拷贝实现的,所以只能拷贝数组首元素的指针如果形参是传递的是int arr[m] 那么形参会被转换为int * 如果传递的是char arr[m] 形参会被转换为char *
因为C++中的二维数组实际上是一维数组,只不过这个一维数组中的元素是保存了另一个一维数组的首地址,比如int arr[m][n],实际上是一个m长度的一维数组,里面存储的元素是n个长度的整形数组指针,所以结合前面的只是如果传递的是二维数组,那么形参会被转换为n个长度的整形数组的指针:int (*arr)[n](注,之前我的理解是二维指针做参数时候,被转换为二级指针,今天通过读书发现我之前的理解是错误的),为了验证这些问题的正确性可以通过编译器中实验
void myfun1(int *arr)
{
int a = 1;
}
void myfun2(int arr[4])
{
int a = 1;
}
void myfun3(char arr[4][10])
{
int a = 1;
}
void myfun4(char **arr)
{
int a = 1;
}
void myfun5(char arr[][9])
{
int a = 1;
}
void myfun6(char arr[][10])
{
int a = 1;
}
int main(int argc, char *argv[])
{
int arrInt[10];
// 正确
myfun1(arrInt);
// 正确:因为是转化为首元素的指针,所以形参中声明的长度并不影响
myfun2(arrInt);
char arrChar[10][10];
// 由于转换为首元素的指针,首元素指针为10个char数组长度的指针
myfun3(arrChar);
// 错误:和myfun3对立面
myfun4(arrChar);
// 错误:和myfun3对立面
myfun5(arrChar);
// 由于转换为首元素的指针,首元素指针为10个char数组长度的指针
myfun6(arrChar);
return 0;
}
void myfun7(char (&arr)[10])
{
int a = 1;
}
char arrChar[10];
// 正确:函数参数为大小为10的字符型数组的引用
myfun7(arrChar);
char arrChar1[9];
// 错误
myfun7(arrChar1);