c - 在C中调用函数时,是否应该给变量一个新地址?

标签 c debugging

我对与我一起工作的另一位程序员的 C 程序的行为感到有点困惑。我无法理解的是:

1) 一个变量是这样定义的

typedef float (array3d_i)[3];
array3d_i d_i[NMAX];

2) 一旦一些值被分配给所有的 d_i's,一个函数被调用是这样的:

void calc(elem3d_i d_element);

从 main 中调用:

calc(d_i[i]);

在循环中。

当 d_i 在 main 中初始化时,每个元素在内存中获得一个地址,我猜是在堆栈或其他地方。当我们调用函数“calc”时,我希望在函数内部,在另一个地址创建变量的副本。但是我调试了程序,我可以看到在函数“calc”中,变量“d_elemt”获得的地址与 main 中的 d_i 相同。

是否正常?

我更困惑了,因为后来调用了另一个函数,情况非常相似,只是现在变量是 float 类型,并且还初始化了一个数组,并且在函数内部,变量的地址与主要的那个。

这怎么可能?为什么不同?代码或调试器是否在做一些奇怪的事情?

谢谢

最佳答案

数组在 C 中通过引用传递,而简单值将通过值传递。或者,数组按值传递,但在此上下文中数组的“值”是对其第一个元素的引用。这就是查尔斯在他的评论中提到的“衰退”。

“引用”当然是指指针,因为 C 没有像 C++ 那样的引用。

C 没有更高层次的数组概念,这也是为什么你不能在被调用函数中计算数组长度的原因。

关于c - 在C中调用函数时,是否应该给变量一个新地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3759351/

相关文章:

c - 通过传递内存地址使用指针扫描值

对 termios.h 常量感到困惑

python - 在 Theano 中打印变量表达式

php - PHP解析/语法错误;以及如何解决它们

javascript - 如何在用户单击框中删除文本?

c++ - 如何使用 windbg "dt"命令从命名空间污染的内存转储中获取信息

C 中的编译器错误

c - 我不知道为什么我的链表指针不动

c++ - 从用户获取字符串中的多个单词的代码

c# - 调试 .NET Async/Await 函数时无法检查变量