面试题答案
一键面试一维数组作为函数参数时在函数内部的看待方式
当调用 func(a)
时,在函数 func
内部,数组 a
会被视为一个指针。虽然函数声明使用 int arr[]
的形式,但实际上编译器会将其当作 int *arr
处理。这意味着在 func
函数中,arr
指向数组 a
的首元素地址,并且无法通过 arr
直接获取原数组 a
的长度。
多维数组作为函数参数与一维数组作为函数参数转换规则的相似点
- 退化规则:多维数组作为函数参数时,同样会发生退化。例如
void func2(int arr[][10])
,这里的arr
也会被当作指针处理,只不过是指向一个包含10个int
类型元素的数组的指针,即int (*arr)[10]
。这和一维数组退化成为指向其首元素的指针类似。 - 无法直接获取原数组长度:无论是一维数组还是多维数组作为函数参数,在函数内部都无法直接通过参数获取原数组完整的长度信息。对于一维数组,无法得知数组元素个数;对于多维数组,只能知道除第一维以外其他维的长度(如
int arr[][10]
可知道第二维长度为10),第一维的长度信息丢失。
多维数组作为函数参数与一维数组作为函数参数转换规则的不同点
- 指针类型:一维数组退化为指向单个元素类型的指针(
int *
),而多维数组退化为指向数组的指针。例如二维数组int arr[][10]
退化为int (*arr)[10]
,是指向包含10个int
类型元素的数组的指针。 - 地址计算方式:在函数内部对元素访问时,一维数组通过指针偏移简单计算元素地址,如
*(arr + i)
获取第i
个元素。多维数组地址计算更为复杂,不仅要考虑第一维的偏移,还要考虑其他维的长度,例如对于int arr[][10]
,访问arr[i][j]
时,地址计算要结合i
和j
以及第二维长度10来计算。