MST

星途 面试题库

面试题:C语言一维数组指针与下标在函数参数传递中的转换

编写一个函数 `void modifyArray(int *ptr, int size)`,要求在函数内部通过指针和下标两种方式修改数组的每个元素,使其值翻倍。主函数中定义 `int arr[4] = {3, 5, 7, 9};` 并调用该函数,阐述在函数参数传递过程中,一维数组指针与下标的转换关系及需要注意的要点。
27.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

void modifyArray(int *ptr, int size) {
    // 使用指针方式修改数组元素
    for (int i = 0; i < size; i++) {
        *(ptr + i) = 2 * (*(ptr + i));
    }
    // 使用下标方式修改数组元素
    for (int i = 0; i < size; i++) {
        ptr[i] = 2 * ptr[i];
    }
}

int main() {
    int arr[4] = {3, 5, 7, 9};
    modifyArray(arr, 4);
    for (int i = 0; i < 4; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

一维数组指针与下标的转换关系

  • 在C语言中,当把一维数组作为函数参数传递时,数组名会自动退化为指向数组首元素的指针。例如 void modifyArray(int *ptr, int size) 函数中,ptr 实际上指向数组 arr 的首元素。
  • 指针和下标在访问数组元素时本质上是等价的。*(ptr + i)ptr[i] 都表示访问数组 ptr 的第 i 个元素。这是因为在编译器处理时,ptr[i] 会被解释为 *(ptr + i)

需要注意的要点

  • 数组越界:无论是使用指针还是下标访问数组元素,都要确保访问的下标在有效范围内。例如上述代码中,size 为4,有效下标范围是0到3,如果访问 ptr[4]*(ptr + 4) 就会导致未定义行为。
  • 函数声明:函数参数声明为数组形式(如 void modifyArray(int arr[], int size))和指针形式(如 void modifyArray(int *ptr, int size))是等价的,都表示传递的是指向数组首元素的指针。
  • 指针运算:使用指针方式访问数组元素时,指针运算要小心,确保每次运算的结果仍然指向有效的内存区域。例如 ptr++ 会改变 ptr 的指向,如果不注意,可能导致后续访问数组元素错误。