在C语言中向函数传递地址

在C语言中向函数传递地址,c,function,pointers,memory-address,C,Function,Pointers,Memory Address,我是C语言的新手,我有一个计算一些变量的函数。但现在让我们简化一下。我想要的是有一个“返回”多个变量的函数。虽然据我所知,在C语言中只能返回一个变量。所以我被告知可以传递变量的地址,并以这种方式执行。这就是我走了多远,我想我能帮上忙。关于C90禁止的东西等,我得到了一些错误。我几乎可以肯定这是我的语法 假设这是我的主要功能: void func(int*, int*); int main() { int x, y; func(&x, &y); prin

我是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 = 5;
*y = 5;

您当前正在做的是将指针设置为地址5。您可能会使用蹩脚的旧编译器,但是一个好的编译器会在将
int
赋值给
int*
变量时检测到类型不匹配,并且不允许您在没有显式强制转换的情况下执行此操作。

除了其他海报为您的函数体建议的更改之外,将原型更改为
void func>(int*,int*)
,并更改您的函数定义(在main下面)以反映void。当您不指定返回类型时,编译器认为您试图暗示int返回

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

将更改参数的值。

当实际为func(int*,int*)时,不能向前声明func(int,int)。此外,func的返回类型应该是什么?因为它不使用return,我建议使用void func(int*,int*)。

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

#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;
}
#包括
#包括
结构多{
智力;
双倍;
charastring[200];
};
结构多fxfoo(int-parm){
struct Multi-retval={0};
如果(parm!=0){
retval.anint=parm;
retval.adouble=parm;
retval.astring[0]=parm;
}
返回返回;
}
内部主(空){
结构多xx;

如果(fxfoo(0).a顺便说一下,我希望x和y的值打印出“5”。希望这是间接理解的。感谢所有伟大的答案,请有人将我对@Mehrdad关于为传递的变量赋值的评论再问一个问题,如果在我的函数中,我实际上是从一个文件中计算出变量是什么。也就是说,我有
fscanf(文件,“%d”,&x)
,它是
fscanf吗(文件“%d”和*x)是的,它应该是
&*x
。然而,
&
在这个上下文中本质上是
*
的反义词。所以你可以简单地说
x
,它是一样的。
&x
肯定是错误的。完美的。非常感谢你的帮助。我有最后一个问题,对不起!使用变量是好的做法吗它是这样的,而你把地址传递给函数,然后在函数本身中改变变量的值,或者这被轻视了,不应该使用?我想这可能是C的优点之一,否则“返回”多个变量会让人头疼,不是吗?@Amit使用这种风格很常见。但是,当一个简单的非指针变量就足够时,不应该使用它。此外,一般来说,设计过程时最好将更改保持为自身的局部更改,而不是围绕程序进行全局更改。这很简单当然,很抱歉,我忘记了,我只是用SO编写了代码。它最初是
void func(int*,int*);
,但没有代码标记,呈现为:void func(int,int);。