我对我正在使用的另一个程序员的C程序的行为感到有点困惑。我无法理解的是:
1)以这种方式定义变量
typedef float (array3d_i)[3];
array3d_i d_i[NMAX];
2)一旦将一些值分配给所有d_i,就会调用一个函数,如下所示:
void calc(elem3d_i d_element);
从main使用:
调用calc(d_i[i]);
循环。
当在main中初始化d_i时,每个元素在内存中获取一个地址,我想在堆栈中或其他地方。当我们调用函数“calc”时,我希望在函数内部,在另一个地址中创建变量的副本。但我调试了程序,我可以看到在函数“calc”中,变量“d_elemt”获得的地址与main中的d_i相同。
是否正常?
我更加困惑,因为后来有调用另一个函数,非常相似的情况,除了现在变量是float类型并且它们的数组也被初始化,并且在函数内部,变量被赋予不同的地址。主要的那个。
这怎么可能?为什么不同?代码或调试器是否做了一些奇怪的事情?
由于
答案 0 :(得分:3)
数组在C中通过引用传递,而简单值将通过值传递。或者,数组也按值传递,但此上下文中数组的“值”是对其第一个元素的引用。这是查尔斯在评论中提到的“腐朽”。
通过“引用”,我的意思是指针,因为C没有像C ++那样的引用。
C没有更高级别的数组概念,这也是您无法计算被调用函数中数组长度的原因。
答案 1 :(得分:2)
这是指针和变量之间的区别。将数组传递给函数时,传递指针(按值)。当你传递一个浮点数时,你传递一个浮点数(按值)。它全部按值传递,但是对于数组,值是指针的地址。
答案 2 :(得分:0)
请注意,“传递数组”与传递指针相同,并且在C
中,所有参数都按值传递。
您在不同的功能中看到的是指针值。指针本身(函数接收的参数)在每个函数中是不同的(您可以检查其地址)
想象
int a = 42, b = 42, c = 42;
如果您在调试器中查看a
,b
或c
,您总会看到42(值),但它们是不同的变量
答案 3 :(得分:0)
正如其他人所说,一切都是按价值传递的。但是,这可能会误导数组。虽然类似于指针,但数组不是指针。指针是保存地址的变量。数组是特定地址的内存块。对于数组,没有单独的变量来保存地址,就像指针一样。当您将数组作为参数传递给函数,或者通过将名称(没有[]索引)分配给指针来获取它的地址时,您确实将其地址包含在变量中。因此,“按值传递”的是指针,而不是数组,即使您使用数组作为参数调用该函数。所以以下是等价的:
void func1(char *const arg);
void func2(char arg[]);