在C中调用函数时,是否应该为变量赋予新地址?

时间:2010-09-21 10:22:32

标签: c debugging

我对我正在使用的另一个程序员的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类型并且它们的数组也被初始化,并且在函数内部,变量被赋予不同的地址。主要的那个。

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

由于

4 个答案:

答案 0 :(得分:3)

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

通过“引用”,我的意思是指针,因为C没有像C ++那样的引用。

C没有更高级别的数组概念,这也是您无法计算被调用函数中数组长度的原因。

答案 1 :(得分:2)

这是指针和变量之间的区别。将数组传递给函数时,传递指针(按值)。当你传递一个浮点数时,你传递一个浮点数(按值)。它全部按值传递,但是对于数组,值是指针的地址。

答案 2 :(得分:0)

请注意,“传递数组”与传递指针相同,并且在C中,所有参数都按值传递。

您在不同的功能中看到的是指针值。指针本身(函数接收的参数)在每个函数中是不同的(您可以检查其地址)

想象

int a = 42, b = 42, c = 42;

如果您在调试器中查看abc,您总会看到42(),但它们是不同的变量

答案 3 :(得分:0)

正如其他人所说,一切都是按价值传递的。但是,这可能会误导数组。虽然类似于指针,但数组不是指针。指针是保存地址的变量。数组是特定地址的内存块。对于数组,没有单独的变量来保存地址,就像指针一样。当您将数组作为参数传递给函数,或者通过将名称(没有[]索引)分配给指针来获取它的地址时,您确实将其地址包含在变量中。因此,“按值传递”的是指针,而不是数组,即使您使用数组作为参数调用该函数。所以以下是等价的:

void func1(char *const arg);
void func2(char arg[]);