首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能用C语言把函数参数指向变量吗?

问你能用C语言把函数参数指向变量吗?
EN

Stack Overflow用户
提问于 2014-02-07 02:46:50
回答 2查看 84关注 0票数 1

我只是在学习C,但是我过去经常使用Ruby,您可以做的一件事是创建一个函数,允许您传入变量,然后在该函数中重新定义变量。然而,在C语言中,函数似乎不查看变量,而是查看该变量中存储的内容。例如:

代码语言:javascript
复制
void add(int a, int b, int c);

int main(void)
{
    int num1 = 1, num2 = 1, num3;

    add(num1, num2, num3);
    printf("%d", num3);

}

void add(int a, int b, int c)
{
    c = a + b;
}

只需返回一个错误,说明未定义中的变量num3。所以我的问题是,我是因为我缺乏知识而做错了这件事吗?如果是的话,正确的方法是什么,或者在C语言中这是不可能的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-07 02:49:48

C按值传递变量。如果在添加后在函数中打印c,则它的值为2。然而,这对main中的变量(未初始化)没有任何影响。要改变这种情况,您必须将其按地址传递:

代码语言:javascript
复制
void add(int a, int b, int *c)
{
    *c = a + b;
}

以及:

代码语言:javascript
复制
add(num1, num2, &num3);

或者,您可以让函数返回新值:

代码语言:javascript
复制
int add(int a, int b)
{
    return a + b;
}

num3 = add(num1, num2);
票数 1
EN

Stack Overflow用户

发布于 2014-02-07 02:50:06

是的,可以,但是C中的参数是通过值传递的。一直都是。你可以通过间接获得你想要的东西,即传递一个指针;

代码语言:javascript
复制
void add(int a, int b, int *sum)
{
    if (!sum)
        // handle error
    *sum = a + b;
}

// calling this function...
add(a, b, &c);

您可以始终添加一个间接级别。如果需要在函数中设置whatever*,则传递一个whatever**。当然,您可以随时更改指针所指的内容,而不添加间接的内容,因为您只需要地址。

代码语言:javascript
复制
void foo(whatever *w) 
{
    // this works, because dereferencing the 
    // pointer gets you to the same address in 
    // memory that the original refers to
    w->something = something_else;

    // this does not work as you may expect 
    // because you are mutating the local copy
    w = caller_will_never_see;
}

当然,我觉得这个版本更好,但这是你的决定:

代码语言:javascript
复制
int add(int a, int b)
{
    return a + b;
}

不需要处理空指针,您可以更自然地调用它:

代码语言:javascript
复制
int a = 1;
int b = 2;
int c = add(a, b);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21618331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档