gpt4 book ai didi

c - 除了返回值之外,在 C 中变量的地址是否必须发送到函数才能修改其值?

转载 作者:行者123 更新时间:2023-11-30 14:41:53 26 4
gpt4 key购买 nike

我尝试了解何时通过传递 C 中的函数来修改变量的值。

我知道在 C 语言中,有两种方法可以更改变量的值:

  • 使用函数的返回值
  • 传递变量的地址来修改其内容

代码如下:

// by address

void foo(int *nb)
{
*nb = 10;
}

int main(void)
{
int nb = 5;
foo(&nb);
printf("%i\n", *nb); // It prints 10
}

// Code to explain

void foo(char **tab)
{
tab[2] = "44";
}

void bar(char *str)
{
str[1] = 'a';
}

int main(void)
{
char **tmp = malloc(sizeof(char *) * 4);
char *str = strdup("Hello");

for (int i = 0; i < 3; ++i)
tmp[i] = malloc(3);

tmp[0] = "11";
tmp[1] = "22";
tmp[2] = "33";
tmp[3] = NULL;

foo(tmp); // It modifies tmp's value
bar(str); // It modifies str's value

for (int i = 0; i < 3; ++i)
printf("%s\n", tmp[i]);
printf("%s\n", str);
}

输出:
11
22
44
你好

预期:
11
22
33
你好

我原本希望向该函数发送一份副本,但最后,字符串和字符 ** 都被修改了。为什么这里要修改变量?

最佳答案

您对 foo(tmp) 的评论说“它修改了 tmp 的值”,但这是不正确的。 tmp是一个指针,并且该指针的值不会被foo修改。调用 foo(tmp)tmp 的值传递给 foo,然后 foo 修改以下内容:指出。它将 tmp[2] 更改为指向 "44"tmp[2]tmp 指向的事物之一;它不是tmp

同样,在bar(str)中,str是一个指针,并且指针的值不会被var改变。相反,bar 更改了 str 指向的字符串中的字符之一。

关于c - 除了返回值之外,在 C 中变量的地址是否必须发送到函数才能修改其值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54707278/

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