2017-09-02 117 views
1

我从显性面向对象的编程语言来,并试图了解C的功能多一点所以决定做一个小程序来做到这一点。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 

回答

1

将它们作为指针。如果没有返回值 - 声明函数无效,或返回的东西

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对象。 在函数调用&值传递指针(地址)的值。 解引用的函数指针N - 所有poerations的值actuqally完成。

+0

这似乎是个伎俩。你介意我问什么&实际上有什么不同? –

+0

@JaheeKaje你基本上做'&value'传递指针值时,'&'给出了指针的值。然后在功能取消引用指针,所以你可以修改实际值 – tgdn

2

看一看这样的:Passing by reference in C

在你的榜样,你是传递变量的值,你想通过指针的值。

+0

我没有考虑这一点,但不完全确定看了那么后决定在这里发表澄清我的困惑。例如,我不确定*和&use,我只知道*表示指针地址。 –

+0

@JaheeKaje当你声明一个指针,是的,你可以说*表示一个指针。但它也是一个解引用操作符。以最简单的方式,当你在一个声明之外的指针上使用*时,它实际上获得了指针指向的值。 –

-1

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

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

return v; 

} 

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

而且在主,你必须保存从功能类似 value=doStuff(value);

0

你应该通过指针返回值到整数的函数而不是整数本身。

为您函数接受一个整数指针(参考),而不是它应该被宣布像这样的整数本身:

int doStuff(int *v) 

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

然后在函数中,我们必须derefernece该指针整数本身:通过使用&

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

最后,主程序应该被修改为指针传递给value,而不是值本身符号:

dostuff(&value);