【问题标题】:dought in returning array and int data type from function in c从 c 中的函数返回数组和 int 数据类型的 dont
【发布时间】:2015-07-19 17:50:44
【问题描述】:

代码 1


    main()
{
    int i ,a[5];
    for(i=0;i<5;i++)
    {
        scanf("%d",&a[i]);
    }
    yo(a);
    for(i=0;i<5;i++)
    {
        printf("%d ",a[i]);
    }
}
void yo(int a[5])
{
    int i;
    for(i=0;i<5;i++)
    {
        a[i]=a[i]+1;
    }
}

在没有返回值的上述代码中(我在函数中返回 void 数据类型),数组“a”在主函数中得到更新,但是当我不使用数组并使用普通 int 数据类型时,值会“ nt得到更新见代码2


main()
{
    int a;
    a=50;
    yo(a);
    printf("%d",a);
}
void yo(int z)
{
    z=150;
}

【问题讨论】:

  • @ryyker “工作”是一个相对术语。都没有崩溃。 OP本质上是在询问传递数组和非数组之间的区别,以及为什么前者似乎是按地址传递,而后者显然是按值传递。这也是任何decent book on the C language 和上千个教程网站中的任何一个都详细介绍的内容。
  • @ryyker 有或没有适当的原型,main() 中的a 的值在代码2 中执行和返回yo()更新。我同意你的观点,无论如何都需要适当的原型设计。
  • @WhozCraig - 我的错。我刚刚重新检查了。你是对的。

标签: c function


【解决方案1】:

这是因为数组a[]是作为指针传递的,而不是数组的副本,直接修改了数组。如果将函数声明为

void yo(int *a)

这将以完全相同的方式工作。但是如果你传递一个int 比如

void yo(int a) {
    a += 1;
}

该函数只接收int副本,它不会影响调用者。要影响传递的变量,您将拥有

void yo(int *a) {
    *a += 1;
}

你猜怎么着?这与我之前在传递数组时的声明相同。当您传递一个指针时,它可以被视为一个数组,或单个值 - 即长度为 1 的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多