MST

星途 面试题库

面试题:C语言一维数组名作为函数参数与指针的关系

当C语言中一维数组名作为函数参数时,它与指针有怎样的等效关系?编写两个函数,一个以数组形式声明参数,另一个以指针形式声明参数,实现相同的功能:计算一维数组所有元素的和,并阐述两者在本质上的联系与区别。
37.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

在C语言中,当一维数组名作为函数参数时,它会被自动转换为指向数组首元素的指针,二者在这种情况下是等效的。以下是实现计算一维数组所有元素和的两个函数,一个以数组形式声明参数,另一个以指针形式声明参数:

// 以数组形式声明参数
int sumWithArray(int arr[], int size) {
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += arr[i];
    }
    return sum;
}

// 以指针形式声明参数
int sumWithPointer(int *ptr, int size) {
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += *(ptr + i);
    }
    return sum;
}

联系

  1. 本质相同:在函数参数传递中,数组名和指针在处理方式上本质是一样的,都指向数组首元素的地址。编译器对arr[i]*(ptr + i)的处理方式相同,都是通过地址偏移来访问数组元素。
  2. 内存访问:无论是以数组形式还是指针形式,对数组元素的内存访问方式是一致的,都是基于首地址和元素偏移量来获取数据。

区别

  1. 语法表示:数组形式声明参数更直观地表示这是一个数组,而指针形式更强调是一个指向数组首元素的指针。例如int arr[]int *ptr声明方式不同。
  2. 含义不同:在函数外部,数组名代表整个数组,有自己的地址和占用空间大小;而指针只是一个变量,存放地址。但在函数参数中,数组名失去了这种含义,退化为指针。
  3. sizeof操作:在函数内部,对以数组形式声明的参数使用sizeof,得到的是指针的大小(通常是4字节或8字节,取决于系统架构),而不是数组实际占用的内存大小。例如sizeof(arr)在函数内部得到的是指针大小,而不是数组所有元素占用空间之和。这与在函数外部对数组名使用sizeof得到数组总大小不同。