MST

星途 面试题库

面试题:C语言中一维数组作为函数参数转换规则应用

在C语言中,已知函数声明 `void func(int arr[])`,请解释当调用此函数并传入一个一维数组 `int a[5] = {1, 2, 3, 4, 5}; func(a);` 时,数组 `a` 在函数 `func` 内部是如何被看待的,以及这与多维数组作为函数参数时在转换规则上有哪些相似点和不同点。
22.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

一维数组作为函数参数时在函数内部的看待方式

当调用 func(a) 时,在函数 func 内部,数组 a 会被视为一个指针。虽然函数声明使用 int arr[] 的形式,但实际上编译器会将其当作 int *arr 处理。这意味着在 func 函数中,arr 指向数组 a 的首元素地址,并且无法通过 arr 直接获取原数组 a 的长度。

多维数组作为函数参数与一维数组作为函数参数转换规则的相似点

  1. 退化规则:多维数组作为函数参数时,同样会发生退化。例如 void func2(int arr[][10]),这里的 arr 也会被当作指针处理,只不过是指向一个包含10个 int 类型元素的数组的指针,即 int (*arr)[10]。这和一维数组退化成为指向其首元素的指针类似。
  2. 无法直接获取原数组长度:无论是一维数组还是多维数组作为函数参数,在函数内部都无法直接通过参数获取原数组完整的长度信息。对于一维数组,无法得知数组元素个数;对于多维数组,只能知道除第一维以外其他维的长度(如 int arr[][10] 可知道第二维长度为10),第一维的长度信息丢失。

多维数组作为函数参数与一维数组作为函数参数转换规则的不同点

  1. 指针类型:一维数组退化为指向单个元素类型的指针(int *),而多维数组退化为指向数组的指针。例如二维数组 int arr[][10] 退化为 int (*arr)[10],是指向包含10个 int 类型元素的数组的指针。
  2. 地址计算方式:在函数内部对元素访问时,一维数组通过指针偏移简单计算元素地址,如 *(arr + i) 获取第 i 个元素。多维数组地址计算更为复杂,不仅要考虑第一维的偏移,还要考虑其他维的长度,例如对于 int arr[][10],访问 arr[i][j] 时,地址计算要结合 ij 以及第二维长度10来计算。