gpt4 book ai didi

c - 在 C 中通过引用传递或使用全局变量

转载 作者:太空狗 更新时间:2023-10-29 15:57:43 32 4
gpt4 key购买 nike

如果我想将值修改为函数并将其带回主函数,哪个更好?说在 C 中按引用传递,我的意思是使用指针,就像这个例子一样。我应该将“a”作为全局变量吗?

#include <stdio.h>
#include <conio.h>

int sum;

int example(int *a,int b)
{
sum = *a + b;
(*a)++;
}

int main(void)
{
int a, b;
printf("Tell me the value of A and B: \n");
scanf("%d %d", &a, &b);
example(&a, b);
printf("The result: %d . And the new value of A: %d", sum, a);

printf("\n\nTHE END\n");
getch();
return 0;
}

最佳答案

我发现将全局变量视为存在于 C 程序中正常函数层次结构之外的某种特殊空间中是有帮助的。如果你用方框中的每个函数绘制一个图表,方框之间的线显示程序执行期间哪些函数调用了哪些函数,main()将在顶部(因为它没有调用者),所有其他函数将出现在 main() 下方。在一个或另一个层面上,线通向其上方的其他功能。

大多数数据只存在于一个函数中——在图中的单个框内。有些是从一个函数传递到另一个函数:像 C 这样的语言中的大多数参数和返回值都属于这一类。但是全局变量是“在所有盒子之外”——在一个任何函数都可以看到和改变它们的地方,这种“开放性”使它们非常危险——如果任何函数中的任何代码都可以改变它们,那么很难您或其他开发相同代码的程序员,一旦达到实际大小,就可以跟踪全局数据可能发生更改的所有可能位置。 (这是一般编程语言常见的“可变状态”问题,而不仅仅是 C,面向对象和函数式编程范式在某种程度上解决了这个问题。)

在你的例子中,只是你问这个问题的事实

Which one is better if I want to modify the value into a function and bring it back to the main?



提示该特定值不应存储在全局变量中。您已经将此特定数据概念化为仅在两个函数之间共享的内容, main()example() .按照我上面给出的推理,这意味着如果可能,变量应该作为参数传递给 example() ,然后返回到 main()通过 returnexample() .传递指向 a 的指针进入 example() ,然后修改 aexample() ,以便更改为 a在控制返回给调用者后仍然存在,是 C 中非常普通的习语。但是需要仔细记录哪些参数会以这种方式进行修改,否则您很快就会陷入全局数据那样的情况,只是不完全很糟糕,很难跟踪哪里 a可能会改变以及它可能会改变成什么。

这并不是说全局变量都不好。它们存在是有原因的。如果您的代码的许多部分需要对同一数据进行读/写访问,并且效率很重要,那么全局变量可能是实现这一目标的最佳方式。在当今最常运行 C 代码的环境中——“接近金属”,在嵌入式系统或驱动程序代码中——通常有硬件资源,如寄存器或专用存储器,可以通过大量的全局变量。或者在某些程序中,您可能有很多状态需要跟踪——一整套变量,其值影响整个程序的行为——传递这些值不仅效率低下,而且使程序不太清楚,因为你有传递给大量函数的同一组许多参数。 (典型的例子是游戏,其中游戏世界的当前状态、玩家的位置、生命数量等在某种程度上与大多数代码相关。)即使在这些情况下,全局变量也很重要变量被记录和命名,以便它们不会与其他类似命名的局部变量或函数参数发生冲突。

有关更高级但相关的主题,请参阅 this answer简要说明,或 this page对于更长时间的讨论,如何将 C 中全局变量的范围(即可见性)限制为具有 static 的单个源文件。关键字,或跨多个文件共享。这对全局数据的可访问性提供了更细粒度的控制,并且可以帮助减轻我上面提到的免费使用全局变量的一些担忧。

关于c - 在 C 中通过引用传递或使用全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30226055/

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