【问题标题】:C - pass by reference? [duplicate]C - 通过引用传递? [复制]
【发布时间】:2018-02-11 10:52:45
【问题描述】:

我来自一门主要面向对象的编程语言,并试图更多地理解 C 的功能,因此决定编写一个小程序来完成这项工作。

我遇到的问题是通常使用 DI 解决的问题,如何将值的引用传递给另一个函数,以便它可以在不使用全局变量的情况下对其执行算术运算?

考虑以下程序:

#include <stdio.h>
#include <stdlib.h>

int doStuff(int v)
{
    v = v + 10; // main->value = 10
}

int otherStuff(int v)
{
    v = v - 10; // main->value = 0
}

int main()
{
    int value = 0;
    int stop = 0;

    do
    {
        printf(" %i should be 0 \n", value);

        doStuff(value); // "value" = 10
        printf(" %i should be 10 \n", value);

        otherStuff(value); // "value" = 0
        printf(" %i should be 0 \n", value);

        exit(0);

        if(value >= 10)
        {
            stop = 1;
        }

    } while(!stop);

}

输出:

0 should be 0
0 should be 10
0 should be 0

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    看看这个:Passing by reference in C

    在您的示例中,您正在传递变量的值,您想要传递指针的值。

    【讨论】:

    • 我确实对此进行了研究,但在阅读后并不确定,因此决定在此处发布以消除我的困惑。例如,我不确定 * 和 & 的用途,我只知道 * 表示指针地址。
    • @JaheeKaje 当你声明一个指针时,是的,你可以说 * 表示一个指针。但它也是一个解引用运算符。用最简单的方式说,当你在声明之外的指针上使用 * 时,它实际上得到了指针指向的值。
    【解决方案2】:

    将它们作为指针传递。如果你不返回值 - 声明函数无效,或者返回一些东西

    void doStuff(int *v)
    {
        *v = *v + 10; // main->value = 10
    }
    
    void otherStuff(int *v)
    {
        *v = *v - 10; // main->value = 0
    }
    

    主要是

            doStuff(&value); // "value" = 10
    /*....*/
            otherStuff(&value); // "value" = 0
    

    函数中的int *v表示v是指向int对象的指针。 在函数调用 &value 中,将指针(地址)传递给该值。 在函数中取消对指针 v 的引用 - 所有的操作实际上都是在值上完成的。

    【讨论】:

    • 这似乎可以解决问题。你介意我问一下 & 实际上有什么不同吗?
    • @JaheeKaje 你基本上通过&amp;value 将指针传递给值,&amp; 给出了指针的值。然后在函数中取消引用指针,以便修改实际值
    • 指针和引用是一回事。它们都引用存储变量的内存地址。因此,& 运算符返回“变量的内存地址”,而 * 运算符返回“存储在内存地址中的数据”。这就是为什么它被称为“取消引用”。取消引用时使用类型有助于确保读取正确数量的数据,并将它们理解为存储在内存中的相同类型。
    【解决方案3】:

    您应该将指向整数的指针传递给函数,而不是整数本身。

    如果你的函数接受一个整数指针(引用)而不是整数本身,它应该这样声明:

    int doStuff(int *v)
    

    这里的*表示将传递一个指向整数的指针。

    然后在函数本身中,我们必须取消引用指向整数本身的指针:

    int doStuff(int *v)
    {
        // The * here is dereferncing the pointer to the integer it is pointing to
        *v = *v + 10; // main->value = 10
    }
    

    最后,应该修改主例程,使用&amp; 符号传递指向value 的指针而不是值本身:

    dostuff(&value);
    

    【讨论】:

      【解决方案4】:

      在你的情况下,你必须从函数中返回一个值:

      int doStuff(int v)
      {
      v = v + 10; // main->value = 10
      
      return v;
      
      }
      
      int otherStuff(int v)
      {
      v = v - 10; // main->value = 0
      return v;
      }    
      

      并且在 main 中,您必须像这样保存从函数返回的值 value=doStuff(value);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-11
        • 2013-11-21
        • 2011-04-07
        • 2019-09-01
        • 1970-01-01
        • 2011-01-17
        • 2018-05-26
        • 2012-10-07
        相关资源
        最近更新 更多