我对与我一起工作的另一位程序员的 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/