2017-09-02 113 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);