2009-04-04 17 views
5

こんにちは。私は、複数の機能を通していくつかのパラメータを参照する必要がある学校向けのプロジェクトに取り組んでいます。私はこのように、変数を別の関数に宣言されている場所から参照することによって渡すことができます方法を理解する:複数の機能を使用して参照渡し

main() { 
    int x = 0; 
    int y = 0; 
    int z = 0; 

    foo_function(&x, &y, &z); 
} 

int foo_function(int* x, int* y, int* z) { 
    *x = *y * *z; 
    return 0; 
} 

しかし、私は別の関数にfooという関数からx、y、zを渡すだろうか?このようなものは私にあらゆる種類のコンパイラ警告を与えます。

int foo_function(int* x, int* y, int* z) { 
    *x = *y * *z; 
    bar(&x, &y, &z); 
    return 0; 
} 

int bar(int* x, int* y, int* z) { 
    //some stuff 
} 
+0

Gaaakkk ...コードと同じ行に中括弧を開いてください。 –

+1

神自身が意図していたように。 – jergason

答えて

11

だけ使用します。

bar(x, y, z); 

X、Y、およびZは、既にポインタです - ちょうどそれらを直接渡します。

覚えておいてください - ポインタはメモリ内の場所です。場所は変わりません。 * x = ...を使用してポインタを逆参照すると、その位置に値が設定されます。しかし、それを関数に渡すと、メモリ内の位置を渡すだけです。同じ場所を別の関数に渡すことができ、うまく動作します。

2

あなたは何もする必要はありません。すでに参照しています。

int foo_function(int* x, int* y, int* z) { 
    bar(x, y, z); 
    return 0; 
} 

int bar(int* x, int* y, int* z) { 
    //some stuff 
} 
2

foo_functionでは、yとzはすでにポインター(int *)であるため、bar(x、y、z)を使用できます。

2
int foo_function(int* x, int* y, int* z) { 
    *x = *y * *z; 
    /* x, y and z are pointers to int 
     &x, &y and &z are pointers to pointer to int 
     bar expects pointers to int, so call bar as: 
    */ 
    bar(x, y, z); 
    return 0; 
} 
2

Cには参照渡しの概念がありません。パラメータは常に値によって渡されます。ただし、ポインタを使用する場合、は実際には実際の値へのポインタです。

しかし、あなたが実際に、本質的に無意味であるポインタのアドレスを取得しようとしている

foo_function(&x, &y, &z); 

で行っている(あなたの代わりにint*int**を渡します)。

xyzが既にポインタであり、あなたは、もはやポインティング・チェーンを作成する必要はありませんように、

foo_function(x, y, z); 

は、正しい呼び出しだろう:)