C语言 通过函数传递数组

mqkwyuun  于 2023-01-12  发布在  其他
关注(0)|答案(3)|浏览(142)

我正在学习变量是如何通过值传递给函数的,而数组是如何通过引用传递的。
我运行了我的脚本来验证,但是指针地址不同。为什么呢?

void arrayFunction(int array[4]);

int main(void){
    int foo[4] = {0, 1, 2, 3};
    printf("This is the address to foo in main: %p\n",&foo);
    arrayFunction(foo);
}

void arrayFunction(int array[4]){
    printf("This is the address to array in method: %p\n", &array);
    array[0] = 22;
}
rjee0c15

rjee0c151#

这是foo的地址,也就是&foo[0]概念上被复制到一个新变量,或者换句话说,指针仍然是通过值传递的。

p8ekf7hl

p8ekf7hl2#

&array是数组变量在被调用函数堆栈中的地址,但是它被实现为指向相同数组元素的指针。
下面是您的程序的修改版本,显示:

#include <stdio.h>
void arrayFunction(int array[4]);

int main(void){
    int foo[4] = {0, 1, 2, 3};
    printf("This is the address to foo in main:     \t%p\n",&foo[0]);
    arrayFunction(foo);
}

void arrayFunction(int array[4]){
    printf("This is the address to array in method: \t%p\n", &array[0]);
    array[0] = 22;
}
t30tvxxf

t30tvxxf3#

数组和普通元素之间有一个细微的区别。如果声明了arr[10],那么只有(arr)给出了第一个元素的地址。在你的代码中,你有指向第一个元素'& arr'的指针的打印地址。只要去掉'&',两者就会显示相同的地址。

#include<stdio.h>

void arrayFunction(int array[4]);

int main(void){
    int foo[4] = {0, 1, 2, 3};
    printf("This is the address to foo in main: %p\n",foo);
    arrayFunction(foo);
}

void arrayFunction(int array[4]){
    printf("This is the address to array in method: %p\n",array);
    array[0] = 22;
}

相关问题