C语言 数组与指针传递的区别

C 语言中,数组作为参数传递给函数时,通常可以以两种方式传递,传递数组本身和传递指向数组的指针。两者在语法上非常相似,但它们的行为存在一些不同。在函数内部,它们都会修改原数组的内容。如需要知道数组的大小,必须显式传递大小信息。arr[5] 和 *arr 在函数声明中虽然写法不同,但本质上是等价的,都表示指向数组首元素的指针。

1、传递数组时

当将数组作为参数传递给函数时,实际上是将数组的 指针(即数组首元素的地址)传递给函数。因此,数组传递给函数时会发生隐式转换,传递的是指向数组的指针,而不是数组的副本。

void func(int arr[5]) {  // 这里 arr 实际上是一个指向 int 的指针
    arr[0] = 10;
}

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    func(arr);
    printf("%d\n", arr[0]);  // 输出 10,因为 arr[0] 被修改
    return 0;
}

2、传递数组指针时

如显式地传递数组指针,例如 int *arr,它的行为是完全相同的。即函数接收到的是指向数组的指针,数组的元素可以被修改。

void func(int *arr) {
    arr[0] = 10;  // 修改数组中的元素
}

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    func(arr);
    printf("%d\n", arr[0]);  // 输出 10
    return 0;
}

3、函数参数的实际区别

无论是 int arr[5] 还是 int *arr,传递给函数时都实际上传递的是 指针,也就是数组的首地址。函数无法知道数组的大小,除非额外传递数组的大小作为参数。

void func(int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
}

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    func(arr, 5);  // 需要显式传递数组的大小
    return 0;
}

区别总结

#include <stdio.h>

// 使用数组作为参数
void func1(int arr[5]) {
    arr[0] = 10;
}

// 使用指针作为参数
void func2(int *arr) {
    arr[0] = 20;
}

int main() {
    int arr[5] = {1, 2, 3, 4, 5};

    func1(arr);
    printf("After func1: %d\n", arr[0]);  // 输出 10

    func2(arr);
    printf("After func2: %d\n", arr[0]);  // 输出 20

    return 0;
}

推荐阅读
cjavapy编程之路首页