MST

星途 面试题库

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

在 C++ 中,当把数组和指针作为函数参数传递时,有哪些本质区别?请分别举例说明,并阐述在不同应用场景下如何选择使用数组参数还是指针参数。
14.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 本质区别
    • 数组
      • 当数组作为函数参数传递时,实际上传递的是数组首元素的指针,数组的大小信息丢失。在函数内部,无法通过常规方式获取传递进来数组的真实大小。例如:
void printArraySize(int arr[]) {
    // 以下计算是错误的,arr在这里是指针,不是数组,sizeof(arr)得到的是指针的大小
    // 假设在64位系统下,指针大小一般为8字节
    std::cout << "Size of arr in function: " << sizeof(arr) << std::endl; 
}

int main() {
    int myArray[] = {1, 2, 3, 4, 5};
    printArraySize(myArray);
    // 在main函数中,数组大小可以正确获取,这里是5 * sizeof(int)
    std::cout << "Size of myArray in main: " << sizeof(myArray) << std::endl; 
    return 0;
}
  • 指针
    • 指针作为函数参数传递,和数组作为参数传递类似,都是传递地址。但指针更强调地址的概念,它可以指向单个元素,也可以指向动态分配的内存区域等。例如:
void printPointer(int* ptr) {
    // ptr是指针,同样无法通过sizeof(ptr)获取其所指对象数量
    std::cout << "Size of ptr in function: " << sizeof(ptr) << std::endl; 
}

int main() {
    int num = 10;
    int* ptr = &num;
    printPointer(ptr);
    return 0;
}
  1. 场景选择
    • 数组参数
      • 场景:当函数逻辑主要是处理一个有逻辑关系的元素集合,并且期望调用者提供一个固定大小的数组时,可以使用数组参数。例如,对一个固定长度的向量进行操作的函数。
      • 示例
void vectorAddition(int a[3], int b[3], int result[3]) {
    for (int i = 0; i < 3; i++) {
        result[i] = a[i] + b[i];
    }
}

int main() {
    int vectorA[3] = {1, 2, 3};
    int vectorB[3] = {4, 5, 6};
    int result[3];
    vectorAddition(vectorA, vectorB, result);
    for (int i = 0; i < 3; i++) {
        std::cout << result[i] << " ";
    }
    return 0;
}
  • 指针参数
    • 场景:当需要处理动态分配的内存或者不确定大小的数据集,或者需要对单个元素进行间接访问操作时,使用指针参数。例如,在处理链表节点时,需要传递节点指针。
    • 示例
struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

void insertNode(ListNode*& head, int newVal) {
    ListNode* newNode = new ListNode(newVal);
    if (head == NULL) {
        head = newNode;
    } else {
        ListNode* current = head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

int main() {
    ListNode* head = NULL;
    insertNode(head, 1);
    insertNode(head, 2);
    return 0;
}