在下面的代码中,我向函数传递一个指向*example[10];
或整个数组的指针?
#include <stdio.h>
void function (int **)
int main ()
{
int *example[10];
function(example);
return 0;
}
void function (int *example[10])
{
/* ... */
return;
}
以下代码的相同问题:
#include <stdio.h>
struct example
{
int ex;
};
void function (struct example *)
int main ()
{
struct example *e;
function(e);
return 0;
}
void function (struct example *e)
{
/* ... */
return;
}
答案 0 :(得分:5)
C只有按值调用,所以(正式地)所有值都按值传递给函数。
但是,与其他数据相比,C中的数组处理方式略有不同,因此在第一个示例中,数组 example 转换为指向其第一个元素的指针,然后传递该指针(按值)到函数。
在你的第二个例子中, e 是指向struct的指针(但它永远不会设置为指向任何地方),并且你将该指针(按值)传递给函数。
在这两种情况下,参数传递都是通过值完成的,但是当您将指针传递给变量时,被调用的函数可以对原始变量进行更改。
答案 1 :(得分:5)
在C中,所有参数都按值传递,包括指针。在传递数组的情况下,数组“衰减”到指向其初始元素的指针。
你的第一个函数传递一个指针,指向一个由10个单位化指针组成的块int
。这可能很有用,因为function(int**)
可以将数组内的指针更改为有效指针。例如,允许这样做:
void function (int *example[10])
{
for (int i = 0 ; i != 10 ; i++) {
// Allocate a "triangular" array
example[i] = malloc((i+1)*sizeof(int));
}
}
(当然调用者现在负责所有这些已分配的内存)
你的第二个函数传递一个未初始化的指针。这完全没用,因为function(struct example *e)
既不能合法地指定也不取消引用此指针。
这是非法的:
void function (struct example *e)
{
e->ex = 123; // UNDEFINED BEHAVIOR! e is uninitialized
}
这不会影响调用者中e
的值:
void function (struct example *e)
{
e = malloc(sizeof(struct example)); // Legal, but useless to the caller
}