2016-10-20 12 views
2

C言語で2つの変数の値を入れ替えようとしましたが、関数を書いても動作しません。変数の2つの値を入れ替えます

#include <stdio.h> 

void fun(int a_local, int b_local) 
{ 
    int temp = a_local; 
    a_local = b_local; 
    b_local = temp; 
} 

int main() 
{ 
    int a_global = 5; 
    int b_global = 7; 

    printf("a=%d, b=%d\n", a_global, b_global); 
    fun(a_global, b_global); 
    printf("a=%d, b=%d\n", a_global, b_global); 

    return 0; 
} 
+0

コードは2つの変数をスワップしました: 'a_local'と' b_local'は、彼らが人生を始めたのと反対の値を持っています。しかし、そのスワップは両親には影響しません: 'a_global、b_global'。 – chux

答えて

0

関数は、引数を渡すとき、代わりにあなたは「参照渡し」とすべての「変更」が関数呼び出しの後に見られますアンパサンドを使用することができ、無効と何も返さないです。

#include <stdio.h> 

void fun(int* a_local, int* b_local) 
{ 
    int temp=*a_local; 
    *a_local=*b_local; 
    *b_local=temp; 
} 
int main() 
{ 
    int a_global=5; 
    int b_global=7; 

    printf("a=%d, b=%d\n", a_global, b_global); 
    fun(&a_global,&b_global); 
    printf("a=%d, b=%d\n", a_global, b_global); 

return 0; 
} 
2

Cでは、すべての関数パラメータは値渡しです。したがって、関数内のパラメーターに対する変更は、呼び出し元の関数からは見えません。

ポインタを変更する必要がある変数ごとにを受け入れるように関数を変更する必要があります。次に、これらの変数の番地を渡します。次に、関数内でポインタを逆参照して、呼び出し関数内の変数を変更します。

#include <stdio.h> 

void fun(int *a_local, int *b_local) 
{ 
    int temp = *a_local; 
    *a_local = *b_local; 
    *b_local = temp; 
} 

int main() 
{ 
    int a_global = 5; 
    int b_global = 7; 

    printf("a=%d, b=%d\n", a_global, b_global); 
    fun(&a_global, &b_global); 
    printf("a=%d, b=%d\n", a_global, b_global); 

    return 0; 
} 
0

あなたの機能上の問題は(両方とも内部変数はに対してローカルな値が値によって渡されていることを、参照することにより、したがって、スワップが適切に行われていないが、関数からの復帰時RAMで失われています関数は、終了時に破棄)

ここでは1つの解決策です:ポインタを使用します。

あなたがそうでなければ自分のローカルコピーが作成されます関数を呼び出す際に、これらのローカルコピーの値が交換され、その後、あなたは関数から戻ったときに破壊され、残し、スワップ機能へのポインタとして変数を渡す必要があり
void fun(int* a_local, int* b_local) 
{ 
    int temp=*a_local; 
    *a_local=*b_local; 
    *b_local=temp; 
} 
0

元の変数は変更されません。

void fun(int* a_local, int* b_local) 
{ 
    int temp=*a_local; 
    *a_local=*b_local; 
    *b_local=temp; 
} 
int main() 
{ 
    int a_global=5; 
    int b_global=7; 

    printf("a=%d, b=%d\n", a_global, b_global); 
    fun(&a_global,&b_global); 
    printf("a=%d, b=%d\n", a_global, b_global); 

return 0; 
} 
0

それをあなたが「楽しい」関数から値を返す必要があります、または彼らが実際にメインで変更されることはありません、あなたのようにすることができません。あなたが機能でそれを行うことができませんでした。この問題を回避するには、この例のように...

int main() 
{ 
    int a_global=5; 
    int b_global=7; 

    printf("a=%d, b=%d\n", a_global, b_global); 
    int temp=a_local; 
    a_local=b_local; 
    b_local=temp; 
    printf("a=%d, b=%d\n", a_global, b_global); 

return 0; 
} 

また、構造体の中に2つの値を入れて、中と楽しいからそれらを渡すためにそれを使用することができます。

関連する問題