【问题标题】:Passing addresses to functions in C将地址传递给 C 中的函数
【发布时间】:2011-04-10 01:23:11
【问题描述】:

我是 C 新手,我有一个计算一些变量的函数。但是现在让我们简化一下。我想要的是有一个“返回”多个变量的函数。尽管据我了解,您只能在 C 中返回一个变量。所以有人告诉我,您可以传递变量的地址并这样做。这就是我走了多远,我想知道我可以帮忙。我在 C90 禁止的东西等方面遇到了相当多的错误。我几乎可以肯定这是我的语法。

说这是我的主要功能:

void func(int*, int*);

int main()
{
    int x, y;
    func(&x, &y);

    printf("Value of x is: %d\n", x);
    printf("Value of y is: %d\n", y);

    return 0;
}

void func(int* x, int* y)
{
    x = 5;
    y = 5;
}

这基本上就是我正在使用的结构。有人可以帮我看看吗?

【问题讨论】:

  • 顺便说一下,我希望 x 和 y 的值打印出“5”。希望被间接理解。
  • 感谢所有出色的答案,有人可以解决我对@Mehrdad 关于为传递的变量赋值的评论

标签: c function pointers memory-address


【解决方案1】:

您应该使用*variable 来指代指针指向的内容:

*x = 5;
*y = 5;

您当前所做的是将指针设置为地址 5。您可能会摆脱蹩脚的旧编译器,但一个好的编译器会在将 int 分配给 int* 变量时检测到类型不匹配,并且不会让您无需显式强制转换即可。

【讨论】:

  • 还有一个问题,如果在我的函数中,我实际上是在弄清楚文件中的变量是什么。 Aka 我有fscanf(file, "%d", &x),是fscanf(file, "%d", &*x); 吗?
  • 是的,应该是&*x。但是,& 在这种情况下本质上是 * 的倒数。所以你可以简单地说x,它会是同样的事情。 &x 肯定是错的。
  • 完美。非常感谢您的帮助。
  • 我有最后一个问题,对不起!使用这样的变量是一种好习惯,而您将地址传递给函数并在函数本身中更改变量的值,或者这是被忽视并且不应该使用的?我认为这可能是 C 的优点之一,否则“返回”多个变量将是一件令人头疼的事情,不是吗?
  • @Amit 这种风格很常见。但是当一个简单的非指针变量就足够了时,不应该使用它。此外,一般来说,设计您的程序以保持本地更改而不是围绕程序进行全局更改通常是一个好主意。它简化了调试并提高了可维护性。
【解决方案2】:
void function(int *x, int* y) {
    *x = 5; 
    *y = 5; 
}

会改变参数的值。

【讨论】:

    【解决方案3】:

    除了其他发帖人对您的函数体建议的更改之外,将您的原型更改为void func(int *,int *),并更改您的函数定义(在 main 下方)以反映 void。当你没有指定返回类型时,编译器会认为你试图暗示一个 int 返回。

    【讨论】:

    • 当然对了,不好意思忘记了,我只是用SO写了代码。
    【解决方案4】:

    当实际上它是 func(int*, int*) 时,您不能转发声明 func(int,int)。此外,func的返回类型应该是什么?由于它不使用返回,我建议使用 void func(int*, int*)。

    【讨论】:

    • 原来是void func(int *, int*);,但没有代码标签,呈现为:void func(int , int);.
    【解决方案5】:

    您可以返回结构类型的单个变量。

    #include <stdio.h>
    #include <string.h>
    
    struct Multi {
      int anint;
      double adouble;
      char astring[200];
    };
    
    struct Multi fxfoo(int parm) {
      struct Multi retval = {0};
      if (parm != 0) {
        retval.anint = parm;
        retval.adouble = parm;
        retval.astring[0] = parm;
      }
      return retval;
    }
    
    int main(void) {
      struct Multi xx;
      if (fxfoo(0).adouble <= 0) printf("ok\n");
      xx = fxfoo(42);
      if (strcmp(xx.astring, "\x2a") == 0) printf("ok\n");
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-09
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多