目录
1.前言
- 去掉变量名,就是类型
- 数组指针的类型就是:int (*)[5]
2. 一维数组传参
- 第一个int arr[]:对的
- 第二个int arr[10]:不写都是对的,写上或者写错也没毛病。但是这里的10没用,没必要写
- 第三个int* arr:数组名是首元素地址,那地址就可以用指针来接收,数组每个元素是int类型的,所以指针用int*
- 第四个int* arr[20]:指针数组,用指针数组接收,没问题。并且,数组大小[20]可以省略
- 第五个int ** arr:也是对的,指针数组里面存放的是指针,数组每个元素类型是int*。而指针数组又是数组,数组名是首元素地址,也就是int*,一级指针的地址可以放到二级指针中,所以可以用二级指针
3.二维数组传参
- 二维数组传参,如果形参也用二维数组(arr[5][5])来接收的话,列不能省略
- 二维数组的数组名是数组第一行地址,也就是一维数组的地址,相当于&arr
- 那么,传递参数的时候,二维数组传递的就是&arr,整个数组的地址。
- 函数形参int* arr:❌ arr数组名,*代表arr是个指针,指向类型是int,但是我们这里是一维数组的地址
- 函数参数int** arr:❌ 二级指针存放一级指针地址,更不能存放数组的地址
- 函数形参int* arr[5]:❌ 这个是指针数组,是个数组,但是我们传递的是数组的地址,不是传递数组
- 函数参数int (*arr)[5] :✔ *arr是个指针,[]指向一个数组,有五个元素,每个元素类型int。我们传递的是第一行数组的地址,第一行有五个元素,每个元素int类型,完美匹配
4.指针传参
4.1 一级指针传参
- int* p = arr //将数组首元素的地址存放到指针p中
- 这里相当于 p就是等于arr。因为p是指针,而arr也是指针,是首元素的地址
- 那么函数传参arr = p
- 接收的时候,肯定可以用int arr[10]来接受,保证函数形参和实参的一致性
- 而int * p = arr,那么接收的时候就可以用int * p来接收。因为就算不懂指针,函数传递实参用arr,从数学来说,arr等于int* p ,那保证函数形参和实参的一致性,形参也可以用int *p
- 所以在打印的时候,arr[i] == p[i]
4.2 二级指针传参
- 二级指针也可以接收指针数组的数组名传参。
- 因为arr数组名是首元素的地址,而首元素是int*类型,也就是一级指针,那一级指针的地址就可以存放到二级指针当中