2

ポインターを使用して2つの整数を交換しようとしました...

#include<stdio.h>
int main()
{
int a,b,*i,*j;
printf("Enter two integer:");
scanf("%d%d",&a,&b);
i=&a;
j=&b;
a=*j;
b=*i;
printf("\n %d \t %d",a,b);
return 0;
}

入力は

12 45

出力は

45 45

いくつかの試行の後、b=*i最初に を割り当ててから を割り当てた場合a=*j、最初の整数、つまり12繰り返していることがわかりました。

なぜこれが起こるのですか?ポインターの私の理解では、これが私がやったことです。*j(つまり、のアドレスに格納されている変数の値a)b*i(つまり、のアドレスに格納されている変数の値b) をa..

このプログラムで実際に何が起こるか説明してください..

4

6 に答える 6

4

概念的には、これはあなたがしたいことです:

int temp = a; //temp <- 12
a = b;        //a <- 45
b = temp;     //b <- 12

概念的には、これはあなたがしていることです:

a = b; //a <- 45
b = a; //b <- 45

C++11 を使用している場合は、これを「エレガントに」行うことができます。

std::tie(b, a) = std::make_tuple(a, b);
于 2013-10-26T18:12:15.243 に答える
3

これが起こることです:

i=&a; //i points to a
j=&b; //j points to b
a=*j; //assign the value of b to a
b=*i; //assign the value of a, which has been assigned to the value of b in the previous step

これは回避策です:

int temp = a;
a = b;
b = temp;
于 2013-10-26T18:15:14.933 に答える
3

シンプル:

#include<iterator>
std::iter_swap(i,j);

または実際に

#include<algorithm>
std::swap(a,b);

または純粋主義者の場合

using std::swap;
swap(a,b); // allow for ADL of user-defined `swap` implementations
于 2013-10-26T18:17:22.320 に答える
2
a=*j;
b=*i;

ia最初のステートメントa値の後のポイントアドレスは、次に値を45割り当てることもそうになりますabb45

      addressof `a` 
      ^
i-----|

      addressof 'b' 
      ^ 
j-----|

に変更を加えると a、逆参照される値 i も変更されます。

単に一時変数を使用する

int temp;
temp=*i;
*i=*j;
*j=temp;
于 2013-10-26T18:12:08.977 に答える
2
i=&a; //i points to a
j=&b; //j points to b
a=*j; // this statement is equvivalent to a = b; (since *j and b both are same)
so a = 45;
now
b=*i; // this statement is equvivalent to b = a; (since *i and a both are same) 
but a value is changed to 45 in previous statement, so the same 45 is assigned to b variable also 

一時変数を使用できます

于 2013-10-26T19:13:11.467 に答える
0

これは、i が a を指しているためです。a に何かを割り当てるとすぐに、a に格納されていた元の値が失われます。3番目の変数 temp を導入して割り当て間の値を保存するか(投稿された回答の1つなど)、または次のようなトリックを実行できます

a=a+b;
b=a-b;
a=a-b;

3 番目の変数の使用を避けるため。

編集 この手法は、符号なし整数型に対してのみ機能します。

于 2013-10-26T18:14:13.257 に答える