在C语言中传递数组给函数

3
我想知道为什么当我将数组传递给函数时,例如用于初始化,它们实际上被初始化了。由于inic函数中的变量与main函数中的变量完全独立(没有涉及指针),那么inic函数如何能够初始化数组v的值?数组sinic函数内部不是一个独立的东西吗?
#include <stdio.h>

void inic(int s[], int n)
{
    int i;
    for(i=0; i<n; i++)
       s[i]=0;
}

main()
{
    int v[10];
    int x[20];

    inic(v, 10);
    inic(x, 20);
}

如果我展示以下这个例子,可能会更加清晰:

#include <stdio.h>

void value(int n)
{
    n = 2;
}

main()
{
    int x=1;
    value(x);
    printf("X is %d\n", x); //The output would be 1. The function *value* doesn't affect X.
}

那么为什么数组的情况不同呢?


1
这个问题是一个近似的重复,但是缺少了一个简单的事实,即指针转换发生在函数参数中。尽管如此,它仍然是一个很好的总结,解释为什么数组名的行为类似于指针。 - WhozCraig
1
本质区别在于s[i]=0;n = 2;之间。在第二种情况下,您正在对变量进行赋值,但在第一种情况下,您正在对变量指向的值进行赋值。 - Ajay Brahmakshatriya
1
@WhozCraig:关于数组到指针的转换,函数参数并没有什么特别之处。除非它在三个特定的上下文中之一(一元&、一元sizeof或用于初始化数组对象的初始化器中的字符串字面量),否则数组表达式将被转换为指针表达式。函数参数只是许多上下文中的一个,其中数组表达式被转换为指针表达式。还有一个单独的规则:用数组类型定义的参数实际上是指针类型。 - Keith Thompson
@KeithThompson 肯定是其中之一,但仍然只是 OP 所问的其中一个。如果听起来像我在断言这是发生的唯一上下文,那不是我的意思。 - WhozCraig
将数组通过引用传递在C++中的实现方法 - Karthick
显示剩余2条评论
1个回答

6
当数组被传递到函数中时,实际上传递的是指针,因此在被调用的函数中分配给数组元素的任何值都会保留在调用函数中。您可以通过在主函数和init函数中打印数组地址(使用printf中的%p)来确认这一点,您将看到它们是相同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接