MST

星途 面试题库

面试题:C语言中一维数组与指针在函数参数传递上的区别

在C语言中,当把一维数组和指针作为函数参数传递时,它们在函数内部的表现有何不同?请举例说明,并解释为什么会有这样的差异。
46.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

在C语言中,当一维数组和指针作为函数参数传递时,它们在函数内部的表现看似相似,但实则有一些关键差异:

1. 本质区别

  • 数组:数组是一块连续的内存区域,有固定的大小和类型。数组名在大部分情况下代表数组首元素的地址,但它并非指针,它有自己独立的内存地址和大小信息。
  • 指针:指针是一个变量,其值为内存地址。它用于间接访问内存中的数据,指针变量本身也占据一定内存空间。

2. 函数参数传递时的表现

  • 一维数组作为函数参数:当一维数组作为函数参数传递时,数组会自动退化为指针。即函数接收到的实际上是数组首元素的地址,而不是整个数组的副本。这意味着在函数内部无法直接获取数组的原始大小。
#include <stdio.h>

void printArraySize1(int arr[]) {
    // sizeof(arr) 在函数内部得到的是指针的大小,而非数组大小
    printf("Size of arr in function: %zu\n", sizeof(arr)); 
}

int main() {
    int myArray[] = {1, 2, 3, 4, 5};
    // sizeof(myArray) 得到数组实际占用的字节数
    printf("Size of myArray in main: %zu\n", sizeof(myArray)); 
    printArraySize1(myArray);
    return 0;
}
  • 指针作为函数参数:指针作为函数参数传递时,传递的是指针变量中存储的地址值。同样在函数内部不能直接获取所指向数组的大小(除非额外传递大小信息)。
#include <stdio.h>

void printArraySize2(int *ptr) {
    // sizeof(ptr) 得到的是指针变量本身的大小
    printf("Size of ptr in function: %zu\n", sizeof(ptr)); 
}

int main() {
    int myArray[] = {1, 2, 3, 4, 5};
    int *ptr = myArray;
    printf("Size of myArray in main: %zu\n", sizeof(myArray)); 
    printArraySize2(ptr);
    return 0;
}

3. 差异原因

  • 数组退化:C语言中数组作为函数参数传递时会退化为指针,主要是为了提高效率。如果每次传递数组都复制整个数组,对于大型数组会消耗大量时间和空间。通过传递数组首地址,函数可以直接访问数组元素,而无需复制整个数组。
  • 指针本质:指针本身只是一个存储地址的变量,传递指针时,只是将这个地址值传递给函数,函数并不知道指针所指向的内存区域实际有多大,除非额外提供大小信息。

综上所述,虽然一维数组和指针在作为函数参数传递时都以地址形式传递,但数组会退化,并且两者在获取原始数据大小等方面存在差异。