在C语言中向函数传递地址
我是C语言的新手,我有一个计算一些变量的函数。但现在让我们简化一下。我想要的是有一个“返回”多个变量的函数。虽然据我所知,在C语言中只能返回一个变量。所以我被告知可以传递变量的地址,并以这种方式执行。这就是我走了多远,我想我能帮上忙。关于C90禁止的东西等,我得到了一些错误。我几乎可以肯定这是我的语法 假设这是我的主要功能:在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
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);。