gpt4 book ai didi

按值调用还是按引用调用?

转载 作者:太空狗 更新时间:2023-10-29 15:17:51 25 4
gpt4 key购买 nike

在下面的代码中,我向函数传递了一个指向*example[10]; 或整个数组的指针?

#include <stdio.h>

void function (int **)

int main ()
{
int *example[10];
function(example);
return 0;
}

void function (int *example[10])
{
/* ... */
return;
}

同样的问题下面的代码:

#include <stdio.h>

struct example
{
int ex;
};

void function (struct example *)

int main ()
{
struct example *e;
function(e);
return 0;
}

void function (struct example *e)
{
/* ... */
return;
}

最佳答案

在 C 中,所有参数都是按值传递的,包括指针。在传递数组的情况下,数组“衰减”为指向其初始元素的指针。

您的第一个函数将一个指针传递给一个由十个指向 int 的未初始化指针组成的 block 。这可能很有用,因为 function(int**) 可以将数组内的指针更改为有效指针。例如,这是允许的:

void function (int *example[10])
{
for (int i = 0 ; i != 10 ; i++) {
// Allocate a "triangular" array
example[i] = malloc((i+1)*sizeof(int));
}
}

(当然调用者现在负责所有分配的内存)

您的第二个函数传递了一个未初始化的指针。这完全没有用,因为 function(struct example *e) 既不能合法地分配也不能取消引用该指针。

这是非法的:

void function (struct example *e)
{
e->ex = 123; // UNDEFINED BEHAVIOR! e is uninitialized
}

这不会影响调用者中 e 的值:

void function (struct example *e)
{
e = malloc(sizeof(struct example)); // Legal, but useless to the caller
}

关于按值调用还是按引用调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21165114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com