-3

重複の可能性:
これらのスワップ関数の動作が異なるのはなぜですか?

以下のコードを見てください。これは 2 つの数値を交換することを目的としていますが、そうではありません。そうでない理由を理解するのを手伝ってください。プログラミング初心者なので、いつもより詳しく教えていただけるとありがたいです。ありがとうございました!

#include <stdio.h>
void swap (int a, int b);
int main (void)
{
   int x = 1;
   int y = 2;
   swap (x, y);
   printf ("Now x is %d and y is %d\n", x, y);

   return 0;

}
//function definition of swap
void swap (int a, int b)
{
   int temp = a;
   int a = b;
   int b = temp;
}
4

2 に答える 2

8

C は値渡しであるため、swap関数は値のコピーを受け取り、呼び出し元の変数に影響を与えることはできません。

呼び出し元の変数に影響を与えるには、変数へのポインターを渡す必要があります。

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

そしてそれを呼び出します

swap(&x, &y);

main

于 2012-11-24T16:45:14.023 に答える
3

これは、変数をポインターではなくコピーで渡すためです。つまり、関数はandswap()の独自のプライベート コピーを受け取り、それらをスワップします。スワップの結果は、呼び出し元には表示されません。正しいコードは次のようになります。xy

#include <stdio.h>

void swap(int *a, int *b);

int main(void)
{
    int x = 1;
    int y = 2;
    swap(&x, &y);
    printf("Now x is %d and y is %d\n", x, y);
    return 0;
}

//function definition of swap
void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
于 2012-11-24T16:45:45.957 に答える