1

重複の可能性:
ポインターを使用したオブジェクトの交換

ポインターを使用してスワッピングを行う方法は知っていますが、次のような別のアプローチを試すと:

/* Pointers */
#include <stdio.h>
int main ()
{
  int a=4,b=6;
  swap(&a,&b);
  printf("A is %d, and B is %d\n",a,b);
  return 0;
}

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

うまくいきません。基本的に、「a」が「b」のアドレスを持つように、スワップ関数はアドレスを変更しています。スワップ関数で値を出力すると、スワップされた値が得られますが、メインには反映されません。関数。誰でも理由を教えてもらえますか?

4

4 に答える 4

9

なぜなら

スワップ関数は、'a' が 'b' のアドレスを持つように、アドレスを変更しています。

真実ではない。アドレスは変更されません (まったく意味がありません)。関数はポインターの値を変更します。これらのポインターはアドレスのコピーであり、これらのポインターは関数の引数であるため、関数に対してローカルです。あなたがしなければならないことは次のとおりです。

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

または、次のように参照を使用できます (C++ のみ)。

int swap(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
    return 0;
}

addressof 演算子なしで呼び出します。

int a = 4, b = 6;
swap(a, b);

ただし、これが実際の実装用であり、「スワップ関数を書く」スタイルの宿題ではない場合は、 のstd::swap() 関数を使用する必要があります<algorithm>

于 2013-01-06T07:54:57.093 に答える
3

標準メソッドを使用して単純に inout として取得すると、実際の変数ではなく、変数のCOPYを受け取ります。ただし、a*variableを渡すと、実際の変数を指す変数が渡されます。メモリ ロケーションのコピーは同じままであるため、swap を使用してメモリ ロケーションを設定できます。

したがって、関数に対して次のコードを試してください。

int swap(int *a, int *b)
{
  int tmp;
  tmp = *a;
  *a = *b;
  *b = tmp;
  return 0;
}
于 2013-01-06T08:24:19.923 に答える
1

スワップの 'a' と 'b' は、メインの 'a' と 'b' ではありません。スワップ内では、これらはポインターです。a,b が指す値を入れ替えたい場合は、次のものが必要です。

int swap( int* pa, int *pb )
{
    int temp;
    temp = *pa;
    *pa = *pb;
    *pb = temp;
    return 0;
}

より適切な変数名を使用していることに注意してください。また、temp を割り当てる必要があります (temp へのポインタの割り当てに対して)。

于 2013-01-06T07:56:52.820 に答える