2017-09-02 10 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型のオブジェクトへのポインタであることを意味します。関数呼び出しで &の値は、値にポインタ(アドレス)を渡します。 関数内でポインタvを逆参照します。すべての呼び出しは、値に対して実行されます。

+0

これはやっているようです。 &実際にどう違うのか聞いてもらえますか? –

+0

@JaheeKajeあなたは基本的に '&value'を実行することによって値へのポインタを渡します、'& 'はポインタの値を与えます。関数内でポインタを間接参照することで、実際の値を変更することができます。 – tgdn

2

はこれを見ている:あなたは、変数の値を渡しているあなたの例ではPassing by reference in C

を、あなたはポインタの値を渡したいです。

+0

私はこれを調べましたが、読んだ後は正確にはわかりませんでしたので、私の混乱を解消するためにここに投稿することに決めました。たとえば、私は*と&の使用が不明ですが、*はポインタのアドレスを示しています。 –

+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);